Press "Enter" to skip to content

openssl ssl证书相关命令

今天再给几个域名证书续期时,遇到了一些问题,其中一些和openssl命令相关,对于我们建站的人来说,这些命令可能经常会用到,这里做个记录以备查阅。

因为涉及到openssl,所以在使用openssl之前需要在使用的系统上安装有openssl,大多数Linux及macOS默认都安装了,Windows系统默认不自带,建议使用openssl或者WSL子系统。

不管是收费还是免费,DV还是EV,如果我们是手动申请SSL证书,都需要有个CSR(Certificate Signing Request,凭证签发请求文件)文件。

常见的SSL证书分为RSA和ECC两类,下面分别是利用openssl生成RSA和ECC的CSR文件命令。

openssl生成ECC CSR文件

ECC的CSR文件需要两个步骤,下面两行命令即可解决:

openssl ecparam -out nodeedge-ecc.key -name prime256v1 -genkey
openssl req -new -key nodeedge-ecc.key -out nodeedge-ecc.csr

openssl生成RSA CSR文件

对比ECC证书,RSA的CSR文件生成比较简单,一行命令就可以:

openssl req -out nodeedge-rsa.csr -new -newkey rsa:2048 -nodes -keyout nodeedge-rsa.key

完成之后当前目录下面应该会有一个csr及key文件,csr文件用来提交到证书申请机构,key需要重点保存,两个文件名可以自定义,但是建议以csr和key结尾。

利用OpenSSL生成自签名证书

生成CA密钥文件:

[root@NodeEdge ~]# openssl genrsa -des3 -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
.........................................................................+++
..................................................................................................................................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

期间会要求输入一个密码,随便输入一个就行,嫌麻烦直接输入123456也行。这个密码要记住,后续会用到。

用上一步生成的CA密钥文件生成一个证书:

[root@NodeEdge ~]# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:*.nodeedge.com
Email Address []:

上述的3560是代表有效期为3650天,出于长远考虑,后期证书烧录到客户端可能会运行很多年,时间长一点有助于减轻运维的负担。

除了第一个需要输入CA的密码及Common Name (eg, your name or your server’s hostname) []:这一步,其他都可以默认留空直接回车。CN这一栏随便填就行。

生成需要的服务器端key文件:

[root@NodeEdge ~]# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.................+++
...................................+++
e is 65537 (0x10001)

为申请证书生成CSR文件:

[root@NodeEdge ~]# openssl req -new -out server.csr -key server.key
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:mqtt.nodeedge.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

如果想要申请单域名证书或者多域名证书比如nodeedge.com或者www.nodeedge.com ,只需要输入对应的域名就可以,如果是要申请泛域名证书或者叫做野卡(wildcard)比如nodeedge.com域名下的所有域名,则输入*.nodeedge.com

建议这一栏不要与上一步的Common Name相同,否则后续证书校验会报错。

出于系统长期正常运行考虑,建议这一栏填写服务器绑定的域名,比如上面的mqtt.nodeedge.com,后续客户端通过域名连接服务器而不是IP。如果非要使用IP连接服务器,这一步需要特殊处理下,我这边考虑到服务器可能出现的迁移等情况,没有使用IP进行连接。

用已生成的自签名的CA根证书签发证书:

[root@NodeEdge ~]# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3600
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=mqtt.nodeedge.com
Getting CA Private Key
Enter pass phrase for ca.key:

日期同样选择长一点的,减轻运维的负担,这里选择的是3600天,差不多10年,实际可根据需要调整。

如果执行过程没有问题的话,当前目录应该有这几个文件:ca.crt ca.key ca.srl server.crt server.csr server.key

验证生成的证书是否是由指定的证书签发

openssl verify -CAfile ca.crt server.crt

如果是,则会输出server.crt: OK

openssl命令行查看SSL证书信息

SSL证书申请下来之后,部署到Web Server之后可以在浏览器里面看到证书的详细信息应该很多人知道,但是如果有的时候只是想查看一下证书的信息,就没必要找个Web Server部署再看,直接在命令行就能查看SSL的信息。

假设申请下来的SSL证书名称为nodeedge-ecc.crt,查看SSL所有信息如下:

openssl x509 -noout -text -in nodeedge-ecc.crt

申请ECC还是RSA证书

这两种证书我都使用过至少一年的时间,ECC和RSA的详细对比还是建议看相关的技术文档,我仅说说实际的使用体验:

  • 据说ECC比RSA证书速度更快,但是这一两年来说,并没有感觉到快在哪里
  • ECC在一些低版本系统或者浏览器平台上不支持,如果只是单ECC证书,可能会导致某些平台无法访问网站
  • 某些服务不支持ECC证书,比如说腾讯云CDN,添加ECC证书会提示证书与私钥不对应或者证书与所选域名不匹配,请检查您上传的证书是否正确(22709),虽然官方文档的cipher支持ECC系列,但是无法添加,如下图所示

tencent-cloud-cdn-ssl-error

解决办法是使用RSA或者部署双证书,Nginx在1.11.0开始支持RSA及ECC双证书支持,这样可以提高访问速度,也能兼顾老平台。

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注