使用OpenSSL构建私有CA

使用OpenSSL构建私有CA:https://blog.51cto.com/1inux/1638154

一、什么是CA

CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。

二、为什么使用CA

CA是PKI(Public Key Infrastructure)体系的核心。它为客户的公开密钥签发公钥证书、发放证书和管理证书,并提供一系列密钥生命周期内的管理服务。它将客户的公 钥与客户的名称及其他属性关联起来,为客户之间电子身份进行认证。证书中心是一个具有权威性、可信赖性和公证性的第三方机构。它是电子商务存在和发展的基础。

简单的说,使用CA不仅能保证数据的安全传输,还能保证目标的可信赖性。

三、CA配置文件主要内容详解

CA 配置文件:/etc/pki/tls/openssl.cnf

  1. ####################################################################
  2. [ ca ]
  3. default_ca = CA_default # The default ca section
  4. ####################################################################
  5. [ CA_default ] //定义openssl作为CA使用时相关配置
  6. dir = /etc/pki/CA # openssl作为CA使用时路径
  7. certs = $dir/certs # 已颁发证书的存储位置
  8. crl_dir = $dir/crl # 已吊销证书的吊销列表的存放位置
  9. database = $dir/index.txt # 证书索引文件 (默认没有需要创建)
  10. #unique_subject = no # Set to 'no' to allow creation of
  11. # several ctificates with same subject.
  12. new_certs_dir = $dir/newcerts # 新颁发证书的存储位置
  13. certificate = $dir/cacert.pem # CA的公钥文件名
  14. serial = $dir/serial # 记录过去签发的所有证书的序列号【每签发一个证书 自动+ 1】 (文本文件 需要创建)
  15. crlnumber = $dir/crlnumber # 已吊销证书编号
  16. crl = $dir/crl.pem # 证书吊销列表
  17. private_key = $dir/private/cakey.pem# CA自己的私钥文件
  18. RANDFILE = $dir/private/.rand # 随机数的获取位置 (隐藏文件)
  19. x509_extensions = usr_cert # 用户证书
  20. default_days = 365 # 颁发证书默认有效时间
  21. default_crl_days= 30 # how long before next CRL
  22. default_md = default # use public key default MD
  23. preserve = no # keep passed DN ordering
  24. ======================================================================
  25. [ policy_match]
  26. 此段为证书相关信息选项,其中match指定的项,要求被签名证书一定要与CA的对应项一致。
  27. [ req_distinguished_name ]
  28. 此段为CA证书的默认配置

四、CA服务器的建立

1、生成私钥文件

注:其保存路径及名字在配置文件[/etc/pki/tls/openssl.cnf]中已经定义:/etc/pki/CA/private/cakey.pem

 # openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048

 genrsa : 用于生成 RSA 密钥对的 OpenSSL 命令。
   -out:输出文件保存位置
   2048:表示秘钥强度也可以使1024

注:由于私钥文件被篡改后将会导致无法估计的灾难,所以一般都会对其进行权限的限制可以使用两种方法:
 一、# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
    # chmod 400 /etc/pki/CA/private/cakey.pem
 二、# (umask 077;openssl genrsa -out private/cakey.pem 1024)
步骤:
[root@1inux CA]# (umask 077;openssl genrsa -out private/cakey.pem 1024)
Generating RSA private key, 1024 bit long modulus
......++++++
...............................................................++++++
e is 65537 (0x10001)
[root@1inux CA]# ls private/        //确认文件是否生成
cakey.pem
[root@1inux CA]# cat private/cakey.pem  //查看其内容
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCof9h3G1ob35B0LpCJnngYqM6Epsnwjwr9gazmw/h/e+QhMh9+
87OAMAxwpdDi+xPdErbt32ck0Pjg4w3pgnNFIAadql/kDLaABzt+Pq4cDMS1cIC+
UuiSRrfn5wVDpDuM+HUc6JSEEEok8KEgKCRuJu/FeUwob0LFl/6blKkCdQIDAQAB
AoGAExZobxWqH34z3vVnai+Ja0G0I1LBjX6mwBDwhTOt8sMWFKyY5Mi2jM7kmd4u
y4eluGVmU4v7IzCJAPC3orwkUoFAHXk+C6172pwuGDgwQxYQtucjeKVMbROqTf6y
1DsxMv2HcsNN5xHQ4PIKOZwuRcW4Vrqh8l96Yr4ZHqxYgAECQQDP9uipdQrz3saH
TWOJzSaP2/jD4NrRvTzq8rO/QjaFasvtledohq6ARfMlkXi+5GuE9x9qI5ViSUGE
OhqiqgaVAkEAz2tWVgmTLqbkzxQFhj3PwKPgQ/2wcYvNoZWyvc1u2AHrka8y7CtF
BUJxsUvxHwwUs7EMBpVeCTlweW1xTv10YQJAIs93nnXjAXM21AsWMEjQvZ/agh8v
QZBllAZQJCGXMrnvrLM86vgwWXRcANva1Ekz3ivnbELMjIkqmFGJh9TiCQJBALJW
O5kmCmImJLzXHhjZtHKRdBWBXd+CsH6p01DV/OPEYuKTnFjqqyFmi5JBFUP4gyQs
qYZPjtaniEkfDDk6OoECQAEe6A44jkJ9LzU8UrigfVhwDqtmiigNLCfJzKZgHlF0
erLd2S3qNqNJSHVXNQ1URz/2hg4Z3CP3nAjHt6GpnY0=
-----END RSA PRIVATE KEY-----

2、生成自签证书

注:自签证书名字已经在配置文件中有定义:cacer.pem

# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days
  命令:
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650

    -key  私钥文件(指明从哪个私钥文件中提取公钥创建证书签署请求)
    -out  指定证书文件存放在位置
    -new   生成新的证书签署请求;
    -days n  证书有效时长,单位为“天”;
    -x509  生成自签证书
【参数中带-x509表示直接生成自签证书,不带则表示生成证书签署请求】
[root@1inux CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
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]:cn        //国家
State or Province Name (full name) []:Henan        //省份
Locality Name (eg, city) [Default City]:ZZ     //地区
Organization Name (eg, company) [Default Company Ltd]:MQCHINA        //公司名称
Organizational Unit Name (eg, section) []:Ops    //公司的部门名称
Common Name (eg, your name or your server's hostname) []:1inux.mqchina.org    //CA服务器的主机名 【证书主机自己的名,必须和主机名一致否则,否则证书验证将无法通过,因为证书通信时将使用此名字进行验证】
Email Address []:root@mqchina.org        //管理员邮箱    
[root@1inux CA]# ls
cacert.pem  certs  crl  newcerts  private

3、为了能使证书可以工作还需要创建两个文件

[root@1inux CA]# touch /etc/pki/CA/index.txt
[root@1inux CA]# echo 01 > /etc/pki/CA/serial
[root@1inux CA]#

OK CA 证书服务器已经搭建完成

五、生成CA用户证书签署请求

1、生成私钥

[root@1inux ssl]# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
.++++++
.............++++++
e is 65537 (0x10001)
[root@1inux httpd]#

2、生成请求签署文件

【注 申请时 此文件中的国家 州 地区以及公司名字必须与CA一致,否则无法签署成功,但Common Name 不能和CA一样】

[root@1inux ssl]# openssl req -new -key /etc/httpd/ssl/httpd.key -out httpd.csr 
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]:cn    //同上
State or Province Name (full name) []:Henan    //同上
Locality Name (eg, city) [Default City]:ZZ    //同上
Organization Name (eg, company) [Default Company Ltd]:MQCHINA    //同上
Organizational Unit Name (eg, section) []:Ops    //可自行设置
Common Name (eg, your name or your server's hostname) []: www.freelove.com    //不能和CA的一样,否则无法签署成功 【此名字是在互联网中被访问到的名字】
Email Address []:root@mqchina.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:    //为了保证证书在互联网中传输安全可以添加密码,如果不想设置密码可以两次回车
An optional company name []:
[root@1inux ssl]# ls
httpd.csr  httpd.key
[root@1inux ssl]#

注:证书签署请求文件后缀为csr

六、签署证书

以上步骤完成后,接下来我们就可以用先前建立的CA来对用户的证书请求进行签名来为用户签发证书了

语法: # openssl ca -in /PATH/FROM/CSR_FILE -out /PATH/TO/CRT_FILE -days N

    -in   证书请求签署文件

   -out  签发后的证书文件

   -days  证书有效天数
[root@1inux CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Apr 15 15:55:25 2015 GMT
            Not After : Apr 12 15:55:25 2025 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = Henan
            organizationName          = MQCHINA
            organizationalUnitName    = Ops
            commonName                = www.freelove.com
            emailAddress              = root@mqchina.org
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                78:B2:6D:35:0B:87:24:25:57:03:C4:8A:7B:4A:09:BC:8D:96:16:A5
            X509v3 Authority Key Identifier: 
                keyid:51:14:D6:51:14:4D:27:1F:A7:5A:7E:91:5D:E1:94:95:AB:9D:C2:DE
Certificate is to be certified until Apr 12 15:55:25 2025 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
[root@1inux CA]# cat index.txt    //在证书索引文件中可以看到我们的证书已经有效了
V    250412155525Z        01    unknown    /C=cn/ST=Henan/O=MQCHINA/OU=Ops/CN=www.freelo/emailAddress=root@mqchina.org
[root@1inux CA]#

注:CA证书文件后缀为:crt

如果在签署ca时出现如下错误,说明未创建/etc/pki/CA/index.txt文件,参考上文配置文件
[root@1inux CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
140002251192136:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r')
140002251192136:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

解决方案:

[root@1inux CA]# touch /etc/pki/CA/index.txt
如果在签署ca时出现如下错误,说明未创建/etc/pki/CA/serial文件,参考上文配置文件
[root@1inux CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory
error while loading serial number
140381399570248:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/serial','r')
140381399570248:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

解决方案:

[root@1inux CA]# echo 01 > /etc/pki/CA/serial
//serial是记录签发证书的序列号,所以创建后要对其赋值00 或其他,然后每签发一个证书自动+1

七、吊销证书

1、获取吊销证书的序列号

语法:
# openssl x509 -in /PATH/FROM/CRT_FILE -noout -serial -subject
-noout 不获取证书本身数据信息
-serial

eg1:
[root@1inux CA]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=Henan/O=MQCHINA/OU=Ops/CN=www.freelove.com/emailAddress=root@mqchina.org

eg2:
[root@1inux CA]# openssl x509 -in /etc/httpd/ssl/httpd.crt -serial -subject
serial=01
subject= /C=cn/ST=Henan/O=MQCHINA/OU=Ops/CN=www.freelove.com/emailAddress=root@mqchina.org
-----BEGIN CERTIFICATE-----
MIIC8jCCAlugAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMCY24x
DjAMBgNVBAgMBUhlbmFuMQswCQYDVQQHDAJaWjEQMA4GA1UECgwHTVFDSElOQTEM
MAoGA1UECwwDT3BzMRowGAYDVQQDDBExaW51eC5tcWNoaW5hLm9yZzEfMB0GCSqG
SIb3DQEJARYQcm9vdEBtcWNoaW5hLm9yZzAeFw0xNTA0MTUxNTU1MjVaFw0yNTA0
MTIxNTU1MjVaMHkxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIZW5hbjEQMA4GA1UE
CgwHTVFDSElOQTEMMAoGA1UECwwDT3BzMRkwFwYDVQQDDBB3d3cuZnJlZWxvdmUu
Y29tMR8wHQYJKoZIhvcNAQkBFhByb290QG1xY2hpbmEub3JnMIGfMA0GCSqGSIb3
DQEBAQUAA4GNADCBiQKBgQDKYueANyldFj6y0o2IaNcZbEmozcnAUq5hkvcEja9N
oN300uWjU4EEw1Rv6UrIp3c5eKgFLaYtHu3g/AN/g+U7neU2UbLmUh+ol1a13/PI
HGu9vPrCJhLqpcVRSm5p3mfHPDRIQ/XF+6gwiFZfZTuDl0ZpvfHm7e24KIpMw0/J
lQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUeLJtNQuHJCVXA8SKe0oJvI2W
FqUwHwYDVR0jBBgwFoAUURTWURRNJx+nWn6RXeGUlaudwt4wDQYJKoZIhvcNAQEF
BQADgYEABkzuiQr1V6isqlp7fRuyuuKGWx9sRGvAPTdmEu8hAZ4TVczOuuoygem9
axGREdtrrvEGN03nIbb0d6t4F/zGrKrDAAdq6ehAMdwBz5hvpZY7Dn67Jg8heIZJ
I2B/ApmYH5gHJ3XfOOEP8KOJ8Ieor+eNWPYNpvh6GId8czpjKks=
-----END CERTIFICATE-----
[root@1inux CA]#

2、实现证书吊销

2.1、吊销证书

# openssl ca -revoke /PATH/FROM/CRT_FILE

[root@1inux CA]# openssl ca -revoke /etc/httpd/ssl/httpd.crt 
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
[root@1inux CA]#

2.2、生成吊销证书的编号

echo 01 > /etc/pkie/CA/crlnumber

[root@1inux CA]# echo 01 > /etc/pki/CA/crlnumber
[root@1inux CA]#

2.3、更新证书吊销列表

openssl crl -gencrl -out THISCA.crl

Openssl 证书文件类型及概念
    证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。
PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。
使用PEM格式存储的证书:
—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–
使用PEM格式存储的私钥:
—–BEGIN RSA PRIVATE KEY—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END RSA PRIVATE KEY—–
使用PEM格式存储的证书请求文件:
—–BEGIN CERTIFICATE REQUEST—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE REQUEST—–
DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。
PFX 或 P12 – 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件。转换时需要输入PFX文件的加密密码。
JKS – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式”转换为标准的Java Key Store(JKS)文件。JKS文件格式被广泛的应用在基于JAVA的WEB服务器、应用服务器、中间件。你可以将JKS文件导入到TOMCAT、 WEBLOGIC 等软件。
KDB – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式转换为标准的IBM KDB文件。KDB文件格式被广泛的应用在IBM的WEB服务器、应用服务器、中间件。你可以将KDB文件导入到IBM HTTP Server、IBM Websphere 等软件。
CSR - 证书请求文件(Certificate Signing Request)。生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):
用户生成自己的公私钥对;
构造自己的证书申请文件,符合 PKCS#10 标准。该文件主要包括了用户信息、公钥以及一些可选的属性信息,并用自己的私钥给该内容签名;
用户将证书申请文件提交给 CA;
CA 验证签名,提取用户信息,并加上其他信息(比如颁发者等信息),用 CA 的私钥签发数字证书;
说 明:数字证书(如x.509)是将用户(或其他实体)身份与公钥绑定的信息载体。一个合法的数字证书不仅要符合 X509 
格式规范,还必须有 CA 的签名。用户不仅有自己的数字证书,还必须有对应的私钥。X509v3 
数字证书主要包含的内容有:证书版本、证书序列号、签名算法、颁发者信息、有效时间、持有者信息、公钥信息、颁发者 ID、持有者 ID 和扩展项。
OCSP – 在线证书状态协议(OCSP,Online Certificate Status 
Protocol,rfc2560)用于实时表明证书状态。OCSP 客户端通过查询 OCSP 
服务来确定一个证书的状态,可以提供给使用者一个或多个数字证书的有效性资料,它建立一个可实时响应的机制,让用户可以实时确认每一张证书的有效性,解决
 由CRL引发的安全问题。。OCSP 可以通过 HTTP协议来实现。rfc2560 定义了 OCSP 客户端和服务端的消息格式。
CER  - 一般指使用DER格式的证书。
CRT - 证书文件。可以是PEM格式。
KEY   - 一般指PEM格式的私钥文件。
CRL -
 证书吊销列表 (Certification Revocation List) 是一种包含撤销的证书列表的签名数据结构。CRL 
是证书撤销状态的公布形式,CRL 就像信用卡的黑名单,用于公布某些数字证书不再有效。CRL 
是一种离线的证书状态信息。它以一定的周期进行更新。CRL 可以分为完全 CRL和增量 CRL。在完全 CRL 中包含了所有的被撤销证书信息,增量
 CRL 由一系列的 CRL 来表明被撤销的证书信息,它每次发布的 CRL 是对前面发布 CRL 的增量扩充。基本的 CRL 
信息有:被撤销证书序列号、撤销时间、撤销原因、签名者以及 CRL 签名等信息。基于 CRL 的验证是一种不严格的证书认证。CRL 能证明在 
CRL 中被撤销的证书是无效的。但是,它不能给出不在 CRL 中的证书的状态。如果执行严格的认证,需要采用在线方式进行认证,即 OCSP 
认证。一般是由CA签名的一组电子文档,包括了被废除证书的唯一标识(证书序列号), CRL用来列出已经过期或废除的数字证书。它每隔一段时间就会更新,因此必须定期下载该清单,才会取得最新信息。
SCEP - 简单证书注册协议。基于文件的证书登记方式需要从您的本地计算机将文本文件复制和粘贴到证书发布中心,和从证书发布中心复制和粘贴到您的本地计算机。 SCEP可以自动处理这个过程但是CRLs仍然需要手工的在本地计算机和CA发布中心之间进行复制和粘贴。
PKCS7 – 加密消息语法(pkcs7),是各种消息存放的格式标准。这些消息包括:数据、签名数据、数字信封、签名数字信封、摘要数据和加密数据。
PKCS12 – pkcs12 (个人数字证书标准)用于存放用户证书、crl、用户私钥以及证书链。pkcs12 中的私钥是加密存放的

openssl生成证书,并解决浏览器不信任问题

原文链接

一、前言

关于SSL的理论知识就不细说了,也了解得不是很深入。

这里主要是记录一下 SSL 证书的生成以及证书配置后发现chrome浏览器访问网站会提示网站不安全的问题。

大致流程如下,如果有两个域名,应该只需要生成自签名证书就可以了。

但是我只有一个域名,所以只能用其他的方式解决。openssl 的安装过程比较简单,不详细记录
image-20210409101855607.png

二、生成证书

第一步 生成私钥文件

命令:sudo openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048

[centos@ip ssl]$ sudo openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
...........+++
......................+++
e is 65537 (0x10001)

检查:sudo vim /etc/pki/CA/private/cakey.pem

第二步 生成自签证书

命令:sudo openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365

[centos@ip ssl]$ sudo openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
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]:CN
State or Province Name (full name) []:Guangdong
Locality Name (eg, city) [Default City]:Shenzhen
Organization Name (eg, company) [Default Company Ltd]:Walle
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:certmall.trustauth.cn
Email Address []:root@amwalle.com
-key    私钥文件(指明从哪个私钥文件中提取公钥创建证书签署请求)
-out    指定证书文件存放在位置
-new    生成新的证书签署请求;
-days n   证书有效时长,单位为“天”;
-x509    生成自签证书

第三步 生成私钥

命令:sudo openssl genrsa -out certificate.key 2048

[centos@ip ssl]$ sudo openssl genrsa -out certificate.key 2048
Generating RSA private key, 2048 bit long modulus
............................................+++
..............................................................+++
e is 65537 (0x10001)

第四步 生成请求签署文件:

命令:sudo openssl req -new -key certificate.key -out certificate.csr

[centos@ip ssl]$ sudo openssl req -new -key certificate.key -out certificate.csr
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]:CN
State or Province Name (full name) []:Guangdong
Locality Name (eg, city) [Default City]:Shenzhen
Organization Name (eg, company) [Default Company Ltd]:Walle
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:www.amwalle.com // 你要访问的域名
Email Address []:root@amwalle.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:  // 密码
An optional company name []:Ops

这里的 hostname 就是部署的工程所在的域名地址,字段与生成自签证书时填写一致即可

第五步 签署证书

做签署证书之前,要先执行以下两个命令(签署证书的时候会用到,否则会报错):

sudo touch /etc/pki/CA/index.txt
echo 01 | sudo tee /etc/pki/CA/serial

签署证书命令:sudo openssl ca -in certificate.csr -out certificate.crt -days 365

-in     证书请求签署文件
-out    签发后的证书文件
-days    证书有效天数

[centos@ip ssl]$ sudo openssl ca -in certificate.csr -out certificate.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jun  2 13:26:26 2019 GMT
            Not After : Jun  1 13:26:26 2020 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Guangdong
            organizationName          = Walle
            organizationalUnitName    = Test
            commonName                = www.amwalle.com
            emailAddress              = root@amwalle.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                61:EA:60:4D:0C:80:C4:03:89:AF:B6:DB:AE:40:E8:AC:4C:2D:29:64
            X509v3 Authority Key Identifier: 
                keyid:6F:DE:B1:A8:8B:88:F3:BE:BE:82:CB:E4:2C:85:A1:F0:25:53:50:96

Certificate is to be certified until Jun  1 13:26:26 2020 GMT (365 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

到这一步,我们得到了下面三个文件:

certificate.crt certificate.csr certificate.key

如果这时直接用certificate.crtcertificate.key 配置 nginx,chrome会提示网站不安全

image-20210409102525978.png

点击“不安全”,会提示“证书不受信任”:

image-20210409102541298.png

这时,可以去免费的证书申请网站上申请证书来解决这个问题

三、证书网站生成新证书

免费 HTTPS 证书申请网站:

以第一个为例。

第一步 通过 CSR 进行创建

也可以通过CSR在线生成工具:https://myssl.com/csr_create.html

从上一节生成的 certificate.csr,读取其内容并粘贴到下面的文本框:

命令:sudo vim certificate.csr

image-20210409102652356.png

第二步 DNS验证

这里要去你的域名提供商处,配置DNS规则,来证明你对该域名拥有所有权。

image-20210409102731721.png

根据上面的信息,新增(或者修改已经存在的相同规则)如下

image-20210409102747157.png

这里是阿里云里面配置DNS的一个示例

配置完成之后,点击第一张图片里面的“配置完成,检测一下:

image-20210409102811145.png

image-20210409102818454.png

如果检测结果为 匹配,则可以再点击第一张图片里面的“点击验证

第三步 下载证书

image-20210409102848686.png

第四步 上传新证书

证书下载之后解压,得到 full_chain.pem

https://certmall.trustauth.cn/Free/index.html 用这个生成得到的是 certificate.crt

将 full_chain.pem 上传至自己的服务器(也可以在服务器上新建一个相同的文件,然后把内容复制上去)

四、配置 nginx

第一步 配置 nginx.conf

首先进入 nginx 配置目录,执行:sudo vim nginx.conf

在 http 中新增配置如下:

    server {
        listen  443 ssl;
        server_name  www.amwalle.com;

        ssl_certificate      full_chain.pem;
        ssl_certificate_key  certificate.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location /index {
                proxy_pass  http://127.0.0.1:7001/index;
            }

        location /test {
                proxy_pass  http://127.0.0.1:7001/test;
            }
        }

其中,full_chain.pem 是上一节生成的,certificate.key 是第二节生成的

如果是用 https://certmall.trustauth.cn/Free/index.html 生成,那么配置如下:

    server {
        listen  443 ssl;
        server_name  www.amwalle.com;

        ssl_certificate      certificate.crt;
        ssl_certificate_key  certificate.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location /index {
                proxy_pass  http://127.0.0.1:7001/index;
            }

        location /test {
                proxy_pass  http://127.0.0.1:7001/test;
            }
        }

第二步 检查配置

进入 nginx 所在目录,执行:sudo ./nginx -t

[centos@ip sbin]$ sudo ./nginx -t
nginx: the configuration file /opt/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/openresty/nginx/conf/nginx.conf test is successful

第三步 重新加载 nginx

在 nginx 目录下,执行:sudo ./nginx -s reload

第四步 访问 HTTPS 地址

检查访问是否正常:

image-20210409103300193.png

查看证书:

image-20210409103311774.png

一些可能问题处理

对于下面的问题,执行该命令解决:sudo touch /etc/pki/CA/index.txt

[centos@ip ssl]$ sudo openssl ca -in certificate.csr -out certificate.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
139981965662096:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/index.txt','r')
139981965662096:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:

对于下面的问题,执行该命令解决:echo 01 | sudo tee /etc/pki/CA/serial

[centos@ip ssl]$ sudo openssl ca -in certificate.csr -out certificate.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory
error while loading serial number
139630067787664:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/serial','r')
139630067787664:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:

如果在多次生成证书的过程中报下面的错误,可以通过先删除,再重新创建 index.txt 文件来解决

TXT_DB error

** 如果在 nginx 测试的过程中报如下错误,可能是由于复制的证书文件不对,检查一下正是是否复制完整

failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)

如果出现响应时间过长,可能是由于防火墙或者安全组设置问题,检查一下防火墙配置

image-20210409103447077.png

创建自签名SSL证书

创建自签名SSL证书 : https://www.myfreax.com/creating-a-self-signed-ssl-certificate/

创建自签名SSL证书

要创建新的自签名SSL证书,请使用openssl req命令:

openssl req -newkey rsa:4096 \
            -x509 \
            -sha256 \
            -days 3650 \
            -nodes \
            -out example.crt \
            -keyout example.key

让我们分解命令并了解每个选项的含义:

  • -newkey rsa:4096-创建新的证书请求和4096位RSA密钥。默认值为2048位。
  • -x509 -创建X.509证书。
  • -sha256 -使用265位SHA(安全哈希算法)。
  • -days 3650 -认证证书的天数。 3650是10年。您可以使用任何正整数。
  • -nodes -创建没有密码的密钥。
  • -out example.crt -指定将新创建的证书写入的文件名。您可以指定任何文件名。
  • -keyout example.key -指定要写入新创建的私钥的文件名。您可以指定任何文件名。

有关openssl req命令选项的更多信息,请访问 OpenSSL req文档页面。

按下Enter键后,命令将生成私钥,并询问您将用于生成证书的一系列问题。

Generating a RSA private key
......................................................................++++
........++++
writing new private key to 'example.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.
-----

输入所需的信息,然后按Enter。

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Alabama
Locality Name (eg, city) []:Montgomery
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linuxize
Organizational Unit Name (eg, section) []:Marketing
Common Name (e.g. server FQDN or YOUR name) []:myfreax.com
Email Address []:hello@myfreax.com

将在指定位置创建证书和私钥。使用ls命令验证是否已创建文件:

ls
example.crt example.key

就是这样!您已经生成了一个新的自签名SSL证书。

备份新证书和外部存储密钥始终是一个好主意。

创建无提示的自签名SSL证书

如果要生成自签名SSL证书而没有提示任何问题,请使用-subj选项并指定所有主题信息

openssl req -newkey rsa:4096 \
            -x509 \
            -sha256 \
            -days 3650 \
            -nodes \
            -out example.crt \
            -keyout example.key \
            -subj "/C=SI/ST=Ljubljana/L=Ljubljana/O=Security/OU=IT Department/CN=www.example.com"
Generating a RSA private key
......................................................................++++
........++++
writing new private key to 'example.key'
-----

-subj行中指定的字段如下:

  • C=-国家/地区名称。 ISO的两个字母缩写。
  • ST= -州或省名。
  • L= -地区名称。您所在的城市的名称。
  • O= -您组织的全名。
  • OU= -组织单位。
  • CN= -完全限定的域名。