https证书申请过程(用于nginx)
https证书" title="https证书">https证书申请过程
文章摘要
在上一篇文章完整搭建linux服务器中介绍了一台服务器从空的操作系统到最后应用通过 https 访问的完整过程,其中上篇文章中在介绍 https 申请时比较简单,这里专门用一篇文章来讲一下详细过程,以及过程中常见问题处理。
https申请整个过程
- 需要先服务器上生成私钥文件 server.key,以及申请证书申请文件 csr 后缀的文件。
- 将证书申请 csr 上传给证书机构,用于申请证书。
- 将申请证书返回的 domainCA.crt 文件和域名证书、中间证书合并成证书链文件 completeCA.crt (文件名自定义即可)。注意有些证书颁发机构返回的证书就是完整的,不需要再处理。
- 将私钥文件 server.key 和 complete.crt 文件配置在 nginx.conf 中即可。
申请ssl证书(globalsign平台为例)
- 执行命令生成私钥
[root@amdx-dr soft]# keytool -genkey -alias amdx -keyalg RSA -keystore /soft/.keystoreEnter keystore password: ***
Re-enter new password: ***
What is your first and last name?
[Unknown]: domain
What is the name of your organizational unit?
[Unknown]: unit
What is the name of your organization?
[Unknown]: IT dept
What is the name of your City or Locality?
[Unknown]: jiangxi
What is the name of your State or Province?
[Unknown]: pingx
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=domain, OU=CTM, O=IT dept, L=jiangxi, ST=pingx, C=MO correct?
[no]: y
Enter key password for <amdx>
(RETURN if same as keystore password):
Re-enter new password: ***
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /soft/.keystore -destkeystore /soft/.keystore -deststoretype pkcs12".
- 执行命令生成公钥,用于申请证书
keytool -certreq -alias amdx -file /soft/request.csr -keystore /soft/server.key
- 将 request.csr 发给客户,客户申请证书,(globalsign平台申请证书)证书返回的一个base64字符串。(domainCA)
- 获取rootCA、IntermediateCA,(均为base64字符串)
IntermediateCA
rootCA
- 三个证书合并成最后nginx需要的.crt文件
- 配置nginx https
server { listen 443;
server_name domain;
ssl on;
ssl_certificate /soft/completeCA.crt;
ssl_certificate_key /soft/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
client_max_body_size 16m;
client_body_buffer_size 128k;
proxy_pass http://domain;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_next_upstream off;
proxy_connect_timeout 30;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
}
遇到的问题
证书问题
- 在nginx配置完https模块之后,执行 ./nginx -t时,出现如下错误
[root@amdx-dr sbin]# ./nginx -tnginx: [emerg] PEM_read_bio_X509_AUX("/soft/5555.macau.ctm.net.cer") failed (SSL: error:0906D064:PEM routines:PEM_read_bio:bad base64 decode)
校验证书合理性:
#合理证书[root@amdx-dr soft]# openssl x509 -text -noout -in rootCA.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
04:00:00:00:00:01:15:4b:5a:c3:94
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
Validity
Not Before: Sep 1 12:00:00 1998 GMT
Not After : Jan 28 12:00:00 2028 GMT
Subject: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
报错证书
[root@amdx-dr soft]# openssl x509 -text -noout -in domainCA.crt
unable to load certificate
140406046984080:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:pem_lib.c:824:
如果证书没有问题,则继续下一环节。
私钥问题
更新正确证书之后,重新配置证书和key,出现如下报错
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/soft/server.key") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: ANY PRIVATE
KEY error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
经过查询相关资料发现,这个问题可能由key不规范导致,打开server.key,发现内容乱码。尝试修改文件编码,问题依旧存在
cd /softvi server.key
:set fileencoding 查看编码
:set fileencoding assin 设置编码
编码问题解决不了,打开私钥文件发现是乱码的,但通过
keytool 生成的私钥是jks格式,是加过密的,需要通过其他方式提取秘钥。
参考:
Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件
具体步骤如下:
//查看证书格式及内容keytool -list -keystore domain.key
//输入密码
Enter keystore password:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry
amdx, Feb 13, 2020, PrivateKeyEntry,
Certificate fingerprint (SHA1): 37:51:60:6F:CE:99:06:27:9A:FB:6D:0E:E4:E1:CB:BE:4F:38:D9:B1
//将”.jks”转为”.p12”(PKCS12格式的证书库)
keytool -importkeystore -srckeystore server.key.old -srcalias amdx -destkeystore newkeystore.p12 -deststoretype PKCS12
//查看新格式(pkcs12)证书库
keytool -deststoretype PKCS12 -keystore newkeystore.p12 -list
//提取私钥
openssl pkcs12 -nocerts -nodes -in newkeystore.p12 -out server.key
//最后更新nginx配置
通过这种方式生成的server.key也是base64格式了,配置到nginx中,发现能够正常访问了。
阿里云的证书
在国内阿里云可以给用户提供免费的ssl证书,在阿里云上申请的https证书就没有那么复杂,直接根据提示申请即可,然后提供了下载功能,可以下载windows版本的.pem文件或者linux版本的.crt文件。
总结
后期 https 证书问题,最好还是用 openssl 而不是用 keytool 的方式生成 csr文件和私钥文件。这次处理过程中踩了很多坑,主要原因就是不清楚 keytool生成的私钥需要格式转换。有时候处理问题往往容易被原来的解决方案误导。所以做事情还是要了解原理。这样才不至于很被动。
以上是 https证书申请过程(用于nginx) 的全部内容, 来源链接: utcz.com/z/514793.html