https证书申请过程(用于nginx)

编程

https证书" title="https证书">https证书申请过程

文章摘要

在上一篇文章完整搭建linux服务器中介绍了一台服务器从空的操作系统到最后应用通过 https 访问的完整过程,其中上篇文章中在介绍 https 申请时比较简单,这里专门用一篇文章来讲一下详细过程,以及过程中常见问题处理。

https申请整个过程

  1. 需要先服务器上生成私钥文件 server.key,以及申请证书申请文件 csr 后缀的文件。
  2. 将证书申请 csr 上传给证书机构,用于申请证书。
  3. 将申请证书返回的 domainCA.crt 文件和域名证书、中间证书合并成证书链文件 completeCA.crt (文件名自定义即可)。注意有些证书颁发机构返回的证书就是完整的,不需要再处理。
  4. 将私钥文件 server.key 和 complete.crt 文件配置在 nginx.conf 中即可。

申请ssl证书(globalsign平台为例)

  1. 执行命令生成私钥

[root@amdx-dr soft]# keytool -genkey -alias amdx -keyalg RSA -keystore /soft/.keystore

Enter 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".

  1. 执行命令生成公钥,用于申请证书

keytool -certreq -alias amdx -file /soft/request.csr -keystore /soft/server.key

  1. 将 request.csr 发给客户,客户申请证书,(globalsign平台申请证书)证书返回的一个base64字符串。(domainCA)
  2. 获取rootCA、IntermediateCA,(均为base64字符串)

    IntermediateCA

    rootCA

  3. 三个证书合并成最后nginx需要的.crt文件
  4. 配置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;

}

}

遇到的问题

证书问题

  1. 在nginx配置完https模块之后,执行 ./nginx -t时,出现如下错误

[root@amdx-dr sbin]# ./nginx -t

nginx: [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 /soft

vi 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

回到顶部