环境: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命令,无法运行。估计是要进行一些配置,但是本人总是配置不对(。•ˇ‸ˇ•。)
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
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生成自签名证书完工 。[]~( ̄▽ ̄)~*