GmSSL生成自签名证书

环境:ubuntu

版本:GmSSL 2.4.2 - OpenSSL 1.1.0d 19 Dec 2018

1. 编译安装GmSSL

先解压GmSSL-master.zip;然后进入解压出来的GmSSL-master目录;

再通过以下指令进行编译安装:

./config

make

make install

注意(Θ0Θ●) :这里不配置--prefix等(即不指定编译及安装的时候程序存放路径)。因为指定了安装目录,编译安装后,直接输入gmssl命令,无法运行。估计是要进行一些配置,但是本人总是配置不对(。•ˇ‸ˇ•。), 多次尝试无果后,放弃了,直接采用默认安装( ̄^ ̄)。(感兴趣的童鞋可以自行试验,ヽ(^_−)ノ毕竟指定了安装目录的会更有利于卸载、移植、维护)

扫描二维码关注公众号,回复: 12336822 查看本文章

2. 修改CA的配置文件(即/usr/local/ssl/openssl.cnf文件)

修改[CA_default]项中的dir,默认如下:

......

[ CA_default ]

dir = ./demoCA # Where everything is kept

......

修改为自己指定的CA根路径,(例如我这里考虑把/home/lt/demoCA作为CA根路径):

[ CA_default ]

dir = /home/lt/demoCA      #./demoCA          # Where everything is kept

3. 初始化CA目录

创建根目录 mkdir -p  /home/lt/demoCA 

cd /home/lt/demoCA

在此路径下创建好newcerts、private、certs、crl子目录,同时创建index.txt、serial文件。

mkdir newcerts private certs crl touch index.txt

创建serial,并写入初始化序号,如01

vi serial

创建的子目录及文件的含义:

  • certs:存放已颁发的证书;
  • newcerts:存放CA指令生成的新证书;
  • private:存放私钥;
  • crl:存放已吊销的整数;
  • index.txt:penSSL定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的;
  • serial:证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号。

可从/usr/local/ssl/openssl.cnf文件中的ca相关的项来查看(σ°∀°)σ..:*☆:

####################################################################
[ ca ]
default_ca  = CA_default        /*The default ca section*/
####################################################################
[ CA_default ]

dir     = /home/lt/demoCA    /* Where everything is kept */
                         /*  #### 这是第一个openssl目录结构中的目录 */
certs       = $dir/certs /* Where the issued certs are kept(已颁发的证书路径,即CA或自签的) */
                         /* #### 这是第二个openssl目录结构中的目录,但非必须 */
crl_dir     = $dir/crl   /* Where the issued crl are kept(已颁发的crl存放目录) */
                         /*  #### 这是第三个openssl目录结构中的目录*/
database    = $dir/index.txt /* database index file */
#unique_subject = no     /* 设置为yes则database文件中的subject列不能出现重复值 */
                         /* 即不能为subject相同的证书或证书请求签名*/
                         /* 建议设置为no,但为了保持老版本的兼容性默认是yes */
new_certs_dir = $dir/newcerts /* default place for new certs(将来颁发的证书存放路径) */
                             /* #### 这是第四个openssl目录结构中的目录 */
certificate = $dir/cacert.pem  /* The A certificate(CA自己的证书文件) */
serial      = $dir/serial      /* The current serial number(提供序列号的文件)*/
crlnumber   = $dir/crlnumber   /* the current crl number(当前crl序列号) */
crl     = $dir/crl.pem         /* The current CRL(当前CRL) */
private_key = $dir/private/cakey.pem  /* The private key(签名时需要的私钥,即CA自己的私钥) */
RANDFILE    = $dir/private/.rand      /* private random number file(提供随机数种子的文件) */
x509_extensions = usr_cert  /* The extentions to add to the cert(添加到证书中的扩展项) */
/* 以下两行是关于证书展示格式的,虽非必须项,但推荐设置。一般就如下格式不用修改 */
name_opt    = ca_default        /* Subject Name options*/
cert_opt    = ca_default        /* Certificate field options */
/* 以下是copy_extensions扩展项,需谨慎使用 */
# copy_extensions = copy  /* 生成证书时扩展项的copy行为,可设置为none/copy/copyall */
                          /* 不设置该name时默认为none */
                          /* 建议简单使用时设置为none或不设置,且强烈建议不要设置为copyall */
# crl_extensions    = crl_ext
default_days    = 365   /* how long to certify for(默认的证书有效期) */
default_crl_days= 30    /* how long before next CRL(CRL的有效期) */
default_md  = default   /* use public key default MD(默认摘要算法) */
preserve    = no        /* keep passed DN ordering(Distinguished Name顺序,一般设置为no */
                        /* 设置为yes仅为了和老版本的IE兼容)*/
policy      = policy_match /* 证书匹配策略,此处表示引用[ policy_match ]的策略 */
/* 证书匹配策略定义了证书请求的DN字段(field)被CA签署时和CA证书的匹配规则 */
/* 对于CA证书请求,这些匹配规则必须要和父CA完全相同 */
[ policy_match ]
countryName = match     /* match表示请求中填写的该字段信息要和CA证书中的匹配 */
stateOrProvinceName = match
organizationName    = match
organizationalUnitName  = optional  /* optional表示该字段信息可提供可不提供 */
commonName      = supplied    /* supplied表示该字段信息必须提供 */
emailAddress        = optional
/* For the 'anything' policy*/
/* At this point in time, you must list all acceptable 'object' types. */

/* 以下是没被引用的策略扩展,只要是没被引用的都是被忽略的 */
[ policy_anything ]
countryName     = optional
stateOrProvinceName = optional
localityName        = optional
organizationName    = optional
organizationalUnitName  = optional
commonName      = supplied
emailAddress        = optional 
/* 以下是添加的扩展项usr_cert的内容*/
[ usr_cert ]
basicConstraints=CA:FALSE   /* 基本约束,CA:FALSE表示该证书不能作为CA证书,即不能给其他人颁发证书*/
/* keyUsage = critical,keyCertSign,cRLSign  # 指定证书的目的,也就是限制证书的用法*/
/* 除了上面两个扩展项可能会修改下,其余的扩展项别管了,如下面的 */
nsComment  = "OpenSSL Generated Certificate" 
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
####################################################################

4、生成证书步骤

a). 进入CA根路径

cd /home/lt/demoCA

b). 生成密钥对(私钥)

gmssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:sm2p256v1 -pkeyopt ec_param_enc:named_curve -out private/cakey.pem

注意(Θ0Θ●):

  • 这里生成的私钥名称需要与openssl.cnf配置文件中的一致;也可输出成其它名称,但需要修改openssl.cnf配置文件中指定的CA私钥private_key = $dir/private/cakey.pem
  • 生成的私钥需要置于private目录下,因为签名时需要从private目录下取该私钥。

c). 生成CA证书

gmssl req -new -x509 -key private/cakey.pem -out cacert.pem

注意(Θ0Θ●):

  • 生成的证书名称也需与openssl.cnf文件中配置的一致;
  • 生成证书时需要输入需要填写一些关于待签人或者公司的一些信息,比如国家名,省份名,组织机构名,主机名,email名,有些信息可以不填写,使用.标识。

d). 生成用户证书请求

gmssl req -new -key private/cakey.pem -out serverreq.pem

注意(Θ0Θ●):

  • 注意openssl.cnf文件中ca段中的policy指定的匹配规则中如果指定了match的,则表示CA证书请求中填写的该字段信息要和CA证书中的匹配。
  • 这里为了测试简单,生成证书请求时,填写的关于待签人或者公司的信息与CA证书生成是保持一致。

e). 用CA证书签名生成用户证书

gmssl ca -in serverreq.pem -out servercert.pem

生成签名证书成功后,查看目录:

可看到目录下以生成了证书文件(servercert.pem)

ok,CA生成自签名证书完工 。[]~( ̄▽ ̄)~*


参考文档:

https://blog.csdn.net/gw85047034/article/details/78811486

https://www.cnblogs.com/f-ck-need-u/p/6091027.html

猜你喜欢

转载自blog.csdn.net/lt4959/article/details/86305608