今天再给几个域名证书续期时,遇到了一些问题,其中一些和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 cloudbool-ecc.key -name prime256v1 -genkey
openssl req -new -key cloudbool-ecc.key -out cloudbool-ecc.csr
openssl生成RSA CSR文件
对比ECC证书,RSA的CSR文件生成比较简单,一行命令就可以:
openssl req -out cloudbool-rsa.csr -new -newkey rsa:2048 -nodes -keyout cloudbool-rsa.key
完成之后当前目录下面应该会有一个csr及key文件,csr文件用来提交到证书申请机构,key需要重点保存,两个文件名可以自定义,但是建议以csr和key结尾。
利用OpenSSL生成自签名证书
生成CA密钥文件:
[root@cloudbool ~]# 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@cloudbool ~]# 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) []:*.cloudbool.com
Email Address []:
上述的3560是代表有效期为3650天,出于长远考虑,后期证书烧录到客户端可能会运行很多年,时间长一点有助于减轻运维的负担。
除了第一个需要输入CA的密码及Common Name (eg, your name or your server’s hostname) []:这一步,其他都可以默认留空直接回车。CN这一栏随便填就行。
生成需要的服务器端key文件:
[root@cloudbool ~]# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.................+++
...................................+++
e is 65537 (0x10001)
为申请证书生成CSR文件:
[root@cloudbool ~]# 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.cloudbool.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
如果想要申请单域名证书或者多域名证书比如cloudbool.com或者www.cloudbool.com ,只需要输入对应的域名就可以,如果是要申请泛域名证书或者叫做野卡(wildcard)比如cloudbool.com域名下的所有域名,则输入*.cloudbool.com。
建议这一栏不要与上一步的Common Name相同,否则后续证书校验会报错。
出于系统长期正常运行考虑,建议这一栏填写服务器绑定的域名,比如上面的mqtt.cloudbool.com,后续客户端通过域名连接服务器而不是IP。如果非要使用IP连接服务器,这一步需要特殊处理下,我这边考虑到服务器可能出现的迁移等情况,没有使用IP进行连接。
用已生成的自签名的CA根证书签发证书:
[root@cloudbool ~]# 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.cloudbool.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证书名称为cloudbool-ecc.crt,查看SSL所有信息如下:
openssl x509 -noout -text -in cloudbool-ecc.crt
申请ECC还是RSA证书
这两种证书我都使用过至少一年的时间,ECC和RSA的详细对比还是建议看相关的技术文档,我仅说说实际的使用体验:
- 据说ECC比RSA证书速度更快,但是这一两年来说,并没有感觉到快在哪里
- ECC在一些低版本系统或者浏览器平台上不支持,如果只是单ECC证书,可能会导致某些平台无法访问网站
- 某些服务不支持ECC证书,比如说腾讯云CDN,添加ECC证书会提示证书与私钥不对应或者证书与所选域名不匹配,请检查您上传的证书是否正确(22709),虽然官方文档的cipher支持ECC系列,但是无法添加,如下图所示
解决办法是使用RSA或者部署双证书,Nginx在1.11.0开始支持RSA及ECC双证书支持,这样可以提高访问速度,也能兼顾老平台。