问题描述
在使用gmssl对用户生成证书的过程中,出现了错误Can't open ./private/cakey.pem for reading, No such file or directory
,情况如下:
命令为gmssl ca -days 3650 -in Alice.csr -out caAlice.crt
解决方法
提示信息很明显,这是由于没有对应文件的问题。首先明确报错中的路径./private/cakey.pem
在哪里。打开gmssl的配置文件,默认目录应该是/usr/local/ssl/openssl.cnf
,找到配置文件中关于证书的部分,具体如下:
在这里先说明,配置文件中CA部分指定的文件基本(crlnumber目前没有用到)在生成CA的过程中都需要调用。那么这些文件的位置在哪里呢?dir
指明了路径,在没修改该文件前,默认路径应该是./demoCA
,这个路径是什么意思呢,就是dir
路径在配置文件目录下的demoCA文件夹下。但是我们查看该dir
路径下的文件信息,根据配置文件我们知道,这里需要包含文件夹crts
、crl
、newcerts
、private
和文件index.txt
、serial
、cacert.pem
、cakey.pem
,因此若没有包含上述文件夹或文件,就会导致调用失败,这便是引起报错的原因。
所以现在我们知道,我们需要查看上述文件是否包含在dir
路径下,若没有则需自行创建(印象中好像连demoCA文件夹gmssl都没有帮用户创建),其中serial
的内容为01
,命令如下:
sudo mkdir crts # 文件夹举例
sudo touch index.txt # 文件举例
为了方便修改,笔者将dir
变成了绝对路径/usr/local/ssl
,防止配置文件路径发生变化时又要重新配置的问题。
下面详细讲述cacert.pem
和cakey.pem
两个文件的问题。如果我们仅创建空的这两个文件,将会导致报错Can't open /usr/local/ssl/cacert.pem for reading, No such file or directory
,如下:
这是因为上述两文件为空,没有办法使用两文件中的CA私钥和CA自签名信息,因此我们需要首先生成这两个文件,上面我们已经说到,由于生成ca的过程中必调用到目录/usr/local/ssl/private
下的cakey.pem
文件和目录/usr/local/ssl
下的cacert.pem
文件,因此我们在生成这两个文件时也必须生成到上述对应目录下,具体命令为:
sudo gmssl ecparam -genkey -name sm2p256v1 -out /usr/local/ssl/private/cakey.pem # 生成CA私钥
sudo gmssl req -x509 -sm3 -days 3650 -key /usr/local/ssl/private/cakey.pem -out /usr/local/ssl/cacert.pem # 生成CA自签名信息
命令中添加sudo
是为了避免报错ecparam: Cannot open output file /usr/local/ssl/private/cakey.pem, Permission denied
,如下:
上述命令中直接使用绝对路径是因为配置文件决定了指定访问文件的固定路径,因此当我们在其他文件夹下使用命令时会是相对目录下的文件,将导致配置文件访问失败,这也是很多类似错误出现的根本原因,就是配置文件中指定路径与用户生成路径不同,导致文件找不到。
题外话
在使用命令gmssl ca -days 3650 -in Alice.csr -out caAlice.crt
过程中的问题:
- 遇到
Sign the certificate? [y/n]:
请不要直接Enter
,因为默认选项是no
- 命令请加上
sudo
否则权限不够可能提示报错如下:
成功CA后应该信息大致如下:
lyg@DESKTOP-C3PNG35:/mnt/e/密码学课设/gmssl$ sudo gmssl ca -days 3650 -in Alice.csr -out caAlice.crt
Using configuration from /usr/local/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Sep 22 02:12:53 2020 GMT
Not After : Sep 20 02:12:53 2030 GMT
Subject:
countryName = CN
stateOrProvinceName = HuBei
organizationName = Hust
organizationalUnitName = CSE
commonName = Alice
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Key Encipherment
Netscape Comment:
GmSSL Generated Certificate
X509v3 Subject Key Identifier:
9B:DA:54:DB:E8:BE:EE:2E:EB:5E:EF:C7:9C:78:31:6F:EE:A4:48:96
X509v3 Authority Key Identifier:
keyid:99:6C:AC:90:8C:1C:68:B3:8C:A8:65:1E:EB:15:6F:4A:DA:CD:7A:B0
Certificate is to be certified until Sep 20 02:12:53 2030 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated