OpenSSL是一個(gè)健壯的、商業(yè)級(jí)的、功能齊全的開源(遵循 Apache 2.0 協(xié)議)工具包,用于傳輸層安全(TLS)和安全套接字層(SSL)協(xié)議,實(shí)現(xiàn)安全通信、避免竊聽、確認(rèn)另一端連接者身份的功能。它也是一個(gè)通用密碼庫(kù)。
本方案基于CentOS8系統(tǒng)設(shè)計(jì),建議在RedHat/CentOS系統(tǒng)中使用。
目錄
1.OpenSSL 制作自簽名證書
1.1.第一階段:制作 CA 根證書
1.2.第二階段:制作服務(wù)器證書
1.3.第三階段:制作客戶端證書(雙向認(rèn)證使用)
2.Web 容器配置 HTTPS站點(diǎn)
2.1.Tomcat 配置方案
2.2.Nginx 配置方案
2.3.Apache Httpd 配置方案
3.客戶端訪問
3.1.安裝 CA 機(jī)構(gòu)證書
3.2.安裝客戶端 PKCS12 證書(雙向認(rèn)證使用)
3.3.常見問題
后記一:HTTPS 和 SSL 的概念和工作原理
后記二:在騰訊云服務(wù)上申請(qǐng)互聯(lián)網(wǎng)域名的公共 CA 機(jī)構(gòu)頒發(fā)的證書
后記三:制作服務(wù)器端自簽證書
1.OpenSSL 制作自簽名證書
1、安裝 OpenSSL 。
[centos@host ~ ]$ sudo dnf install openssl
2、創(chuàng)建 SSL 工作目錄。
證書包括 CA 認(rèn)證機(jī)構(gòu)、服務(wù)器和客戶端三類證書的制作,在 SSL 工作根目錄下分別建立"ca"、"server"、"client"子目錄存放對(duì)應(yīng)的輸出文件,并設(shè)置所有者為證書管理賬戶。
[centos@host ~ ]$ sudo mkdir -p /data/ssl/ca
[centos@host ~ ]$ sudo mkdir -p /data/ssl/server
[centos@host ~ ]$ sudo mkdir -p /data/ssl/client
[centos@host ~ ]$ sudo chown -R centos:centos /data/ssl
3、術(shù)語(yǔ)說(shuō)明
| 文件類型 | 說(shuō)明 |
|---|---|
| KEY | 非對(duì)稱私鑰文件,文件擴(kuò)展名通常為 ".key" |
| CSR | 只包含公鑰的證書簽名申請(qǐng),文件擴(kuò)展名通常為 ".csr" |
| PEM | 只包含公鑰的證書,文件擴(kuò)展名通常為 ".pem" |
| PKCS12 | 包含公鑰和私鑰證書,文件擴(kuò)展名通常為 ".p12" |
1.1.第一階段:制作 CA 根證書
1、制作 CA【秘鑰】。
操作過程:設(shè)置 CA 秘鑰口令。
[centos@host ~ ]$ openssl genrsa -des3 -out /data/ssl/ca/ca.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
................................+++++
............+++++
e is 65537 (0x010001)
Enter pass phrase for /data/ssl/ca/ca.key:
Verifying - Enter pass phrase for /data/ssl/ca/ca.key:
說(shuō)明:
- 【openssl genrsa】表示制作秘鑰。
- 【-des3】表示加密秘鑰使用的算法;
- 【-out】表示秘鑰的輸出文件;
- 【2048】表示秘鑰的密碼強(qiáng)度。
查看 CA 秘鑰文件(需要輸入秘鑰口令):
[centos@host ~ ] openssl rsa -in /data/ssl/ca/ca.key
Enter pass phrase for /data/ssl/ca/ca.key:
......
2、制作 CA 【根證書簽名申請(qǐng)】。
輸入 CA 秘鑰文件,輸出 CA 根證書簽名申請(qǐng)文件。
操作過程:驗(yàn)證 CA 秘鑰口令 => 設(shè)置國(guó)家名稱 => 設(shè)置省份名稱 => 設(shè)置城市名稱 => 設(shè)置組織機(jī)構(gòu)名稱 => 設(shè)置組織單元名稱 => 設(shè)置證書名稱 => 設(shè)置電子郵件地址和擴(kuò)展屬性(密碼提示信息和可選的公司名稱)。
[centos@host ~ ]$ openssl req -new -key /data/ssl/ca/ca.key -out /data/ssl/ca/ca.csr
Enter pass phrase for /data/ssl/ca/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]:ch
State or Province Name (full name) []:sd
Locality Name (eg, city) [Default City]:qd
Organization Name (eg, company) [Default Company Ltd]:private
Organizational Unit Name (eg, section) []:zhangyi
Common Name (eg, your name or your server's hostname) []:ca
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
說(shuō)明:
- 【openssl req】表示制作證書簽名申請(qǐng)。
- 【-new】表示生成證書請(qǐng)求文件;
- 【-key】表示秘鑰的輸入文件;
- 【-out】表示證書簽名申請(qǐng)的輸出文件。
注意:【Common Name】應(yīng)為 CA 機(jī)構(gòu)的名稱。
查看 CA 證書申請(qǐng)文件:
[centos@host ~ ]$ openssl req -in /data/ssl/ca/ca.csr -noout -text
3、生成 CA 自簽名【根證書】,即對(duì)簽名申請(qǐng)進(jìn)行自簽名生成證書。
輸入 CA 秘鑰文件、CA 根證書簽名申請(qǐng),輸出 CA 自簽名根證書文件。
操作過程:驗(yàn)證 CA 秘鑰口令。
[centos@host ~ ]$ openssl x509 -req -days 3650 -signkey /data/ssl/ca/ca.key -in /data/ssl/ca/ca.csr -out /data/ssl/ca/ca.pem
Signature ok
subject=C = ch, ST = sd, L = qd, O = private, OU = zhangyi, CN = ca
Getting Private key
Enter pass phrase for /data/ssl/ca/ca.key:
說(shuō)明:
- 【openssl x509】表示制作自簽名證書。
- 【-req】表示輸入文件的類型是證書簽名申請(qǐng);
- 【-days】表示證書的有效期,單位是天;
- 【-signkey】表示簽名秘鑰的輸入文件;
- 【-in】表示證書簽名申請(qǐng)的輸入文件;
- 【-out】表示證書的輸出文件。
查看 CA 證書文件:
[centos@host ~ ]$ openssl x509 -in /data/ssl/ca/ca.pem -noout -text
4、導(dǎo)出 CA【 PKCS12 證書】。
輸入 CA 自簽的 CA 證書文件、CA 秘鑰,輸出 CA PKCS12 證書。
操作過程:設(shè)置 PKCS12 證書口令。
[centos@host ~ ]$ gmssl pkcs12 -export -in /data/ssl/ca/ca.pem -inkey /data/ssl/ca/ca.key -out /data/ssl/ca/ca.p12 -name ca
Enter Export Password:
Verifying - Enter Export Password:
說(shuō)明:
- 【openssl pkcs12】表示制作 PKCS12 證書。
- 【-export 】表示導(dǎo)出 PKCS12 證書;
- 【-in】表示簽名證書的輸入文件;
- 【-inkey】表示秘鑰的輸入文件;
- 【-name】表示 PKCS12 證書的別名;
- 【-out】表示 PKCS12 證書的輸出文件。
查看 CA PKCS12 證書文件(需要輸入 CA PKCS12 證書口令):
[centos@host ~ ]$ gmssl pkcs12 -in /data/ssl/ca/ca.p12 -info
Enter Import Password:
......
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
5、查看 CA 產(chǎn)生的全部文件。
[centos@host ~ ]$ ls /data/ssl/ca/
ca.csr ca.key ca.p12 ca.pem
1.2.第二階段:制作服務(wù)器證書
1、制作服務(wù)器【秘鑰】。
操作過程:設(shè)置服務(wù)器秘鑰口令。
[centos@host ~ ]$ openssl genrsa -des3 -out /data/ssl/server/server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................................+++++
...........+++++
e is 65537 (0x010001)
Enter pass phrase for /data/ssl/server/server.key:
Verifying - Enter pass phrase for /data/ssl/server/server.key:
說(shuō)明:
- 【openssl genrsa】表示制作秘鑰。
- 【-des3】表示加密秘鑰使用的算法;
- 【-out】表示秘鑰的輸出文件;
- 【2048】表示秘鑰的密碼強(qiáng)度。
查看服務(wù)器秘鑰文件(需要輸入秘鑰口令):
[centos@host ~ ] openssl rsa -in /data/ssl/server/server.key
Enter pass phrase for /data/ssl/server/server.key:
......
2、制作服務(wù)器【證書簽名申請(qǐng)】。
輸入服務(wù)器秘鑰文件,輸出服務(wù)器證書簽名申請(qǐng)文件。
操作過程:驗(yàn)證服務(wù)器秘鑰口令 => 設(shè)置國(guó)家名稱 => 設(shè)置省份名稱 => 設(shè)置城市名稱 => 設(shè)置組織機(jī)構(gòu)名稱 => 設(shè)置組織單元名稱 => 設(shè)置證書名稱 => 設(shè)置電子郵件地址和擴(kuò)展屬性(密碼提示信息和可選的公司名稱)。
[centos@host ~ ]$ openssl req -new -key /data/ssl/server/server.key -out /data/ssl/server/server.csr
Enter pass phrase for /data/ssl/server/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]:ch
State or Province Name (full name) []:sd
Locality Name (eg, city) [Default City]:qd
Organization Name (eg, company) [Default Company Ltd]:private
Organizational Unit Name (eg, section) []:zhangyi
Common Name (eg, your name or your server's hostname) []:192.168.216.128
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
說(shuō)明:
- 【openssl req】表示制作證書簽名申請(qǐng)。
- 【-new】表示生成證書請(qǐng)求文件;
- 【-key】表示秘鑰的輸入文件;
- 【-out】表示證書簽名申請(qǐng)的輸出文件。
注意:【Common Name】應(yīng)為服務(wù)器的 IP 地址或者 DNS(如:192.168.216.128 或者 localhost)。在 在 Web 容器配置后,當(dāng)客戶端使用 HTTPS 協(xié)議訪問時(shí),如果域名與【Common Name】不一致,則會(huì)進(jìn)行風(fēng)險(xiǎn)提示。
查看服務(wù)器證書申請(qǐng)文件:
[centos@host ~ ]$ openssl req -in /data/ssl/server/server.csr -noout -text
3、生成 CA 簽名的服務(wù)器【證書】,即 CA 對(duì)服務(wù)器簽名申請(qǐng)進(jìn)行簽名生成服務(wù)器證書。
輸入 CA 根證書文件、 CA 秘鑰文件、服務(wù)器證書簽名申請(qǐng),輸出 CA 簽名的服務(wù)器證書文件。
操作過程:驗(yàn)證 CA 秘鑰口令。
[centos@host ~ ]$ openssl x509 -req -days 3650 -CA /data/ssl/ca/ca.pem -CAkey /data/ssl/ca/ca.key -CAcreateserial -in /data/ssl/server/server.csr -out /data/ssl/server/server.pem
Signature ok
subject=C = ch, ST = sd, L = qd, O = private, OU = zhangyi, CN = 192.168.216.128
Getting CA Private Key
Enter pass phrase for /data/ssl/ca/ca.key:
說(shuō)明:
- 【openssl x509】表示制作 CA 簽名的證書。
- 【-req】表示輸入文件的類型是證書簽名申請(qǐng);
- 【-days】表示證書的有效期,單位是天;
- 【-CA】表示 CA 根證書的輸入文件;
- 【-CAkey】表示 CA 秘鑰的輸入文件;
- 【-CAcreateserial】表示如果 CA 序列號(hào)文件不存在自動(dòng)創(chuàng)建;
- 【-in】表示證書簽名申請(qǐng)的輸入文件;
- 【-out】表示證書的輸出文件。
查看服務(wù)器證書文件:
[centos@host ~ ]$ openssl x509 -in /data/ssl/server/server.pem -noout -text
4、導(dǎo)出服務(wù)器【 PKCS12 證書】。
輸入 CA 簽名的服務(wù)器證書文件,輸出服務(wù)器 PKCS12 證書。
操作過程:驗(yàn)證服務(wù)器秘鑰口令 => 設(shè)置 PKCS12 證書口令。
[centos@host ~ ]$ openssl pkcs12 -export -in /data/ssl/server/server.pem -inkey /data/ssl/server/server.key -out /data/ssl/server/server.p12 -name https_cert
Enter pass phrase for /data/ssl/server/server.key:
Enter Export Password:
Verifying - Enter Export Password:
說(shuō)明:
- 【openssl pkcs12】表示制作 PKCS12 證書。
- 【-export 】表示導(dǎo)出 PKCS12 證書;
- 【-in】表示簽名證書的輸入文件;
- 【-inkey】表示秘鑰的輸入文件;
- 【-name】表示 PKCS12 證書的別名;
- 【-out】表示 PKCS12 證書的輸出文件。
查看服務(wù)器 PKCS12 證書文件(需要輸入服務(wù)器 PKCS12 證書口令):
[centos@host ~ ]$ openssl pkcs12 -in /data/ssl/server/server.p12 -info
Enter Import Password:
......
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
5、查看服務(wù)器產(chǎn)生的全部文件。
[centos@host ~ ]$ ls /data/ssl/server
server.pem server.csr server.key server.p12
1.3.第三階段:制作客戶端證書(雙向認(rèn)證時(shí)使用)
1、制作客戶端【秘鑰】。
操作過程:設(shè)置客戶端秘鑰口令。
[centos@host ~ ]$ openssl genrsa -des3 -out /data/ssl/client/client.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.........+++++
..........+++++
e is 65537 (0x010001)
Enter pass phrase for /data/ssl/client/client.key:
Verifying - Enter pass phrase for /data/ssl/client/client.key:
說(shuō)明:
- 【openssl genrsa】表示制作秘鑰。
- 【-des3】表示加密秘鑰使用的算法;
- 【-out】表示秘鑰的輸出文件;
- 【2048】表示秘鑰的密碼強(qiáng)度。
查看客戶端秘鑰文件(需要輸入秘鑰口令):
[centos@host ~ ] openssl rsa -in /data/ssl/client/client.key
Enter pass phrase for /data/ssl/client/client.key:
......
2、制作客戶端【證書簽名申請(qǐng)】。
輸入客戶端秘鑰文件,輸出客戶端證書簽名申請(qǐng)文件。
操作過程:驗(yàn)證客戶端秘鑰口令 => 設(shè)置國(guó)家名稱 => 設(shè)置省份名稱 => 設(shè)置城市名稱 => 設(shè)置組織機(jī)構(gòu)名稱 => 設(shè)置組織單元名稱 => 設(shè)置證書名稱 => 設(shè)置電子郵件地址和擴(kuò)展屬性(密碼提示信息和可選的公司名稱)。
[centos@host ~ ]$ openssl req -new -key /data/ssl/client/client.key -out /data/ssl/client/client.csr
nter pass phrase for /data/ssl/client/client.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]:ch
State or Province Name (full name) []:sd
Locality Name (eg, city) [Default City]:qd
Organization Name (eg, company) [Default Company Ltd]:private
Organizational Unit Name (eg, section) []:zhangyi
Common Name (eg, your name or your server's hostname) []:https_client
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
說(shuō)明:
- 【openssl req】表示制作證書簽名申請(qǐng)。
- 【-new】表示生成證書請(qǐng)求文件;
- 【-key】表示秘鑰的輸入文件;
- 【-out】表示證書簽名申請(qǐng)的輸出文件。
注意:【Common Name】應(yīng)為客戶端的統(tǒng)一標(biāo)識(shí)。
查看客戶端證書申請(qǐng)文件:
[centos@host ~ ]$ openssl req -in /data/ssl/client/client.csr -noout -text
3、生成 CA 簽名的客戶端【證書】,即 CA 對(duì)客戶端簽名申請(qǐng)進(jìn)行簽名生成客戶端證書。
輸入 CA 根證書文件、 CA 秘鑰文件、客戶端證書簽名申請(qǐng),輸出 CA 簽名的客戶端證書文件。
操作過程:驗(yàn)證 CA 秘鑰口令。
[centos@host ~ ]$ openssl x509 -req -days 3650 -CA /data/ssl/ca/ca.pem -CAkey /data/ssl/ca/ca.key -CAcreateserial -in /data/ssl/client/client.csr -out /data/ssl/client/client.pem
Signature ok
subject=C = ch, ST = sd, L = qd, O = private, OU = zhangyi, CN = https_client
Getting CA Private Key
Enter pass phrase for /data/ssl/ca/ca.key:
說(shuō)明:
- 【openssl x509】表示制作 CA 簽名的證書。
- 【-req】表示輸入文件的類型是證書簽名申請(qǐng);
- 【-days】表示證書的有效期,單位是天;
- 【-CA】表示 CA 根證書的輸入文件;
- 【-CAkey】表示 CA 秘鑰的輸入文件;
- 【-CAcreateserial】表示如果 CA 序列號(hào)文件不存在自動(dòng)創(chuàng)建;
- 【-in】表示證書簽名申請(qǐng)的輸入文件;
- 【-out】表示證書的輸出文件。
查看客戶端證書文件:
[centos@host ~ ]$ openssl x509 -in /data/ssl/client/client.pem -noout -text
4、導(dǎo)出客戶端【 PKCS12 證書】。
輸入 CA 簽名的客戶端證書文件,輸出客戶端 PKCS12 證書。
操作過程:驗(yàn)證客戶端秘鑰口令 => 設(shè)置 PKCS12 證書口令。
[centos@host ~ ]$ openssl pkcs12 -export -in /data/ssl/client/client.pem -inkey /data/ssl/client/client.key -out /data/ssl/client/client.p12 -name https_client
Enter pass phrase for /data/ssl/client/client.key:
Enter Export Password:
Verifying - Enter Export Password:
說(shuō)明:
- 【openssl pkcs12】表示制作 PKCS12 證書。
- 【-export 】表示導(dǎo)出 PKCS12 證書;
- 【-in】表示簽名證書的輸入文件;
- 【-inkey】表示秘鑰的輸入文件;
- 【-name】表示 PKCS12 證書的別名;
- 【-out】表示 PKCS12 證書的輸出文件。
查看客戶端 PKCS12 證書文件(需要輸入客戶端 PKCS12 證書口令):
[centos@host ~ ]$ openssl pkcs12 -in /data/ssl/client/client.p12 -info
Enter Import Password:
......
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
5、查看客戶端產(chǎn)生的全部文件。
[centos@host ~ ]$ ls /data/ssl/client
client.pem client.csr client.key client.p12
2.Web 容器配置 HTTPS 站點(diǎn)
2.1.Tomcat 配置方案
1、安裝并配置 Tomcat 。
[centos@host ~]$ sudo tar zxvf apache-tomcat-9.0.34.tar.gz -C /usr/local
[centos@host ~]$ sudo mv /usr/local/apache-tomcat-9.0.34 /usr/local/tomcat-9.0.34
[centos@host ~]$ sudo gedit /usr/local/tomcat-9.0.34/conf/server.xml
在文件中的增加以下配置并保存(服務(wù)器認(rèn)證):
<Server>
<Service>
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true"
keystoreFile="/data/ssl/server/server.p12"
keystoreType="PKCS12"
keystorePass="123456a?">
</Connector>
</Service>
</Server>
在文件中的增加以下配置并保存(雙向認(rèn)證):
<Server>
<Service>
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true"
keystoreFile="/data/ssl/server/server.p12"
keystoreType="PKCS12"
clientAuth="true"
truststoreFile="/data/ssl/ca/ca.p12"
truststoreType="PKCS12"
truststorePass="123456a?">
</Connector>
</Service>
</Server>
2、啟動(dòng)/重新啟動(dòng) Tomcat 。
[centos@host ~]$ sudo /usr/local/tomcat-9.0.34/bin/startup.sh
或者
[centos@host ~]$ sudo /usr/local/tomcat-9.0.34/bin/shutdown.sh && /usr/local/tomcat-9.0.34/bin/startup.sh
2.2.Nginx 配置方案
1、安裝并配置 Nginx 。
[centos@host ~]$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
[centos@host ~]$ tar -zxvf nginx-1.18.0.tar.gz
[centos@host ~]$ cd nginx-1.18.0
[centos@host nginx-1.18.0]$ ./configure --with-http_ssl_module
[centos@proxy-1 nginx-1.18.0]$ make
[centos@proxy-1 nginx-1.18.0]$ sudo make install
[centos@host ~]$ sudo gedit /usr/local/nginx/conf/nginx.conf
在文件中的增加以下配置并保存:
http {
server {
listen 80;
listen 443 ssl;
server_name localhost;
# 服務(wù)器簽名證書文件
ssl_certificate /data/ssl/server/server.pem;
# 服務(wù)器秘鑰文件
ssl_certificate_key /data/ssl/server/server.key;
# 開啟客戶端證書認(rèn)證(雙向認(rèn)證)
# ssl_verify_client on;
# CA 證書(雙向認(rèn)證)
# ssl_client_certificate /data/ssl/ca/ca.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
...
}
}
}
2、啟動(dòng)/重新啟動(dòng) Nginx 服務(wù)器。
[centos@host ~]$ sudo /usr/local/nginx/sbin/nginx
或者
[centos@host ~]$ sudo /usr/local/nginx/sbin/nginx -s reload
2.3.Apache Httpd 配置方案
1、安裝并配置 Apache Httpd。
[centos@host ~]$ sudo dnf install httpd
[centos@host ~]$ sudo dnf install mod_ssl openssl
[centos@host ~]$ sudo setenforce 0
[centos@host ~]$ sudo gedit /etc/httpd/conf.d/ssl.conf
在文件中的編輯以下配置并保存:
# 監(jiān)聽端口
Listen 443 https
# Https 根路徑
DocumentRoot "/var/www/html"
# 服務(wù)器域名
ServerName localhost
# 服務(wù)器簽名證書文件
SSLCertificateFile /data/ssl/server/server.pem
# 服務(wù)器秘鑰文件
SSLCertificateKeyFile /data/ssl/server/server.key
# 開啟客戶端證書認(rèn)證(雙向認(rèn)證)
# SSLVerifyClient require
# CA 證書(雙向認(rèn)證)
# SSLCACertificateFile /data/ssl/ca/ca.pem
2、啟動(dòng)/重新啟動(dòng) Apache Httpd 服務(wù)器。
[centos@host ~]$ sudo systemctl start httpd.service
或者
[centos@host ~]$ sudo systemctl restart httpd.service
3.客戶端配置
3.1.安裝 CA 機(jī)構(gòu)證書






3.2.安裝客戶端 PKCS12 證書(雙向認(rèn)證使用)
1、參照章節(jié)"3.1.安裝 CA 機(jī)構(gòu)證書",安裝 CA 機(jī)構(gòu)證書。
2、安裝客戶端 PKCS12 證書。






3.3.常見問題
1、瀏覽器在地址欄中輸入【https://127.0.0.1:8443】。

瀏覽器提示 "各個(gè)網(wǎng)站通過證書證明自己的身份。Firefox 不能信任此網(wǎng)站,它使用的證書對(duì) 127.0.0.1:8443 無(wú)效。"
原因:訪問的 IP 和 DNS 如果與服務(wù)器證書的【Common Name】屬性不一致。
解決:使用服務(wù)器證書認(rèn)定的 IP 和 DNS 訪問網(wǎng)站,本例中服務(wù)器證書的【Common Name】屬性為 "192.168.216.128",因此應(yīng)該在地址欄中輸入【https://192.168.216.128:8443】。
2、瀏覽器在地址欄中輸入【https://192.168.216.128:8443】。

瀏覽器提示 "各個(gè)網(wǎng)站通過證書證明自己的身份。Firefox 不信任 192.168.216.128:8443,因其證書頒發(fā)者未知,證書是自簽名的,或者服務(wù)器未發(fā)送正確的中間證書。"
原因:瀏覽器沒有安裝 CA 機(jī)構(gòu)的根證書。
解決:參照章節(jié)"3.1.安裝 CA 機(jī)構(gòu)證書",安裝 CA 機(jī)構(gòu)證書。
3、瀏覽器在地址欄中輸入【https://192.168.216.128:8443】。

瀏覽器提示 "連接到 192.168.216.128:8443 時(shí)發(fā)生錯(cuò)誤。SSL 對(duì)等端無(wú)法核實(shí)您的證書。"
原因:瀏覽器沒有安裝客戶端的 PKCS12 證書。
解決:參照章節(jié)"安裝客戶端 PKCS12 證書",安裝客戶端 PKCS12 證書。
后記一:SSL 和 HTTPS 的概念和工作原理
1、SSL 協(xié)議
SSL(Secure Sockets Layer 安全套接字協(xié)議)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。SSL 在傳輸層與應(yīng)用層之間對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。
SSL協(xié)議本身可以分為兩層:
- 底層為SSL記錄協(xié)議(SSL record protocol);
- 上層為SSL握手協(xié)議(SSL handshake protocol)、SSL密碼變化協(xié)議(SSL change cipher spec protocol)和SSL警告協(xié)議(SSL alert protocol)。

1)SSL握手協(xié)議:是SSL協(xié)議非常重要的組成部分,用來(lái)協(xié)商通信過程中使用的加密套件(對(duì)稱加密算法、密鑰交換算法和MAC算法等)、在服務(wù)器和客戶端之間安全地交換密鑰,實(shí)現(xiàn)服務(wù)器和客戶端的身份驗(yàn)證。客戶端和服務(wù)器通過握手協(xié)議建立一個(gè)會(huì)話。會(huì)話包含一組參數(shù),主要有會(huì)話ID、對(duì)方的證書、加密套件(包括密鑰交換算法、數(shù)據(jù)加密算法和MAC算法)及主密鑰。
2)SSL密碼變化協(xié)議:客戶端和服務(wù)器端通過密碼變化協(xié)議通知對(duì)端,隨后的報(bào)文都將使用新協(xié)商的加密套件和密鑰進(jìn)行保護(hù)和傳輸。
3)SSL警告協(xié)議:用來(lái)允許一方向另一方報(bào)告告警信息。消息中包含告警的嚴(yán)重級(jí)別和描述。
4)SSL記錄協(xié)議:主要負(fù)責(zé)對(duì)上層的數(shù)據(jù)進(jìn)行分塊、計(jì)算并添加MAC、加密,最后把記錄塊傳輸給對(duì)方。
2、HTTPS 協(xié)議
HTTPS 是超文本傳輸安全協(xié)議是一種網(wǎng)絡(luò)安全傳輸協(xié)議。常見的HTTP 協(xié)議采用明文傳輸數(shù)據(jù),隱私信息安全性較差;而 HTTPS 協(xié)議利用 SSL 來(lái)加密數(shù)據(jù)包,提供對(duì)網(wǎng)絡(luò)服務(wù)器的身份認(rèn)證,能夠保護(hù)傳輸?shù)碾[私信息,提高數(shù)據(jù)安全性和完整性。
HTTPS協(xié)議和HTTP協(xié)議的主要區(qū)別:
- HTTPS 需要向 CA 認(rèn)證機(jī)構(gòu)申請(qǐng)證書。
- HTTPS 是 HTTP+SSL 組成的加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議, 比 HTTP 根據(jù)安全。
- HTTP 是明文傳輸協(xié)議,HTTPS 則是具有安全性的 SSL 加密傳輸協(xié)議。
- HTTP 和 HTTPS 使用的是完全不同的連接方式,默認(rèn)的服務(wù)端口也不同,HTTP 使用 80 端口,HTTPS 則使用 443 端口。
3、SSL 證書
HTTPS 的核心設(shè)計(jì)是在數(shù)據(jù)傳輸之前的握手,握手過程中確定了數(shù)據(jù) 非對(duì)稱加密算法 的密碼。在握手過程中網(wǎng)站會(huì)向?yàn)g覽器發(fā)送 SSL 證書,SSL 證書是一個(gè)支持 HTTPS 網(wǎng)站的身份證明,SSL 證書里面包含了網(wǎng)站的域名,證書有效期,證書的頒發(fā)機(jī)構(gòu)以及用于加密傳輸密碼的公鑰等信息。
非對(duì)稱加密算法:非對(duì)稱加密算法需要兩個(gè)密鑰:公開密鑰(PublicKey:簡(jiǎn)稱公鑰)和私有密鑰(PrivateKey:簡(jiǎn)稱私鑰)。公鑰與私鑰是一對(duì),如果用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能解密。
由于公鑰加密的密碼只能被在申請(qǐng)證書時(shí)生成的私鑰解密,因此瀏覽器在生成密碼之前需要先核對(duì)當(dāng)前訪問的域名與證書上綁定的域名是否一致,同時(shí)還要對(duì)證書的頒發(fā)機(jī)構(gòu)進(jìn)行驗(yàn)證,如果驗(yàn)證失敗瀏覽器會(huì)給出證書錯(cuò)誤的提示。
SSL 證書的文件格式遵循 X.509標(biāo)準(zhǔn),是一種PKI(Public Key Infrastructure,公鑰基礎(chǔ)結(jié)構(gòu))證書,主要負(fù)責(zé)負(fù)責(zé)傳輸公鑰。
4、HTTPS 的工作原理
HTTPS 在傳輸數(shù)據(jù)之前需要客戶端(瀏覽器)與服務(wù)端(網(wǎng)站)之間進(jìn)行一次握手,在握手過程中將確立雙方加密傳輸數(shù)據(jù)的密碼信息。握手過程的具體描述如下:
1)瀏覽器將自己支持的一套加密規(guī)則發(fā)送給網(wǎng)站。
2)網(wǎng)站從中選出一組加密算法與 HASH 值算法,并將自己的身份信息以證書的形式發(fā)回給瀏覽器。證書里面包含了網(wǎng)站地址,加密公鑰,以及證書的頒發(fā)機(jī)構(gòu)等信息。
3)瀏覽器獲得網(wǎng)站證書之后瀏覽器要做以下工作:
① 驗(yàn)證證書的合法性(頒發(fā)證書的機(jī)構(gòu)是否合法,證書中包含的網(wǎng)站地址是否與正在訪問的地址一致等),如果證書受信任,則瀏覽器欄里面會(huì)顯示一個(gè)小鎖頭,否則會(huì)給出證書不受信的提示。
② 如果證書受信任,或者是用戶接受了不受信的證書,瀏覽器會(huì)生成一串隨機(jī)數(shù)的密碼,并用證書中提供的公鑰加密。
③ 使用約定好的 HASH 值算法計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。
4)網(wǎng)站接收瀏覽器發(fā)來(lái)的數(shù)據(jù)之后要做以下的操作:
① 使用自己的私鑰將信息解密取出密碼,使用密碼解密瀏覽器發(fā)來(lái)的握手消息,并驗(yàn)證HASH是否與瀏覽器發(fā)來(lái)的一致。
② 使用密碼加密一段握手消息,發(fā)送給瀏覽器。
5)瀏覽器解密并計(jì)算握手消息的 HASH 值,如果與服務(wù)端發(fā)來(lái)的 HASH 值一致,此時(shí)握手過程結(jié)束,之后所有的通信數(shù)據(jù)將由之前瀏覽器生成的隨機(jī)密碼并利用對(duì)稱加密算法進(jìn)行加密。
HTTPS對(duì)應(yīng)的通信時(shí)序圖如下:

瀏覽器與網(wǎng)站互相發(fā)送加密的握手消息并驗(yàn)證,目的是為了保證雙方都獲得了一致的密碼,并且可以正常的加密解密數(shù)據(jù),為后續(xù)真正數(shù)據(jù)的傳輸做一次測(cè)試。HTTPS 常用的加密算法包括:
- 非對(duì)稱加密算法:RSA,DSA/DSS
- 對(duì)稱加密算法:AES,RC4,3DES
- HASH 算法:MD5,SHA1,SHA256
后記二:在騰訊云服務(wù)上申請(qǐng)互聯(lián)網(wǎng)域名的公共 CA 機(jī)構(gòu)頒發(fā)的證書
在互聯(lián)網(wǎng)上訪問【https://console.qcloud.com/ssl】,申請(qǐng)騰訊云服務(wù)賬號(hào)后申請(qǐng)公共 CA 機(jī)構(gòu)頒發(fā)的證書即可。個(gè)人證書可以免費(fèi)申請(qǐng)。





后記三:制作服務(wù)器端自簽證書
[centos@host ~]$ openssl genrsa -des3 -out /data/ssl/server/server.key 2048
[centos@host ~]$ openssl req -x509 -new -nodes -sha512 -days 365 \
-subj "/C=cn/ST=sd/L=qd/O=private/OU=zhangyi/CN=192.168.216.128" \
-key /data/ssl/server/server.key \
-out /data/ssl/server/server.pem