RedHat/CentOS8【OpenSSL】制作自簽證書和 HTTPS 配置

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)證書

第1步
第2步
第3步
第4步
第5步
第6步

3.2.安裝客戶端 PKCS12 證書(雙向認(rèn)證使用)

1、參照章節(jié)"3.1.安裝 CA 機(jī)構(gòu)證書",安裝 CA 機(jī)構(gòu)證書。

2、安裝客戶端 PKCS12 證書。

第1步

第2步
第3步
第4步
第5步
第6步

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)。

第1步,證書管理界面
第2步,確認(rèn)證書類型
第3步,填寫證書信息,證書信息(尤其是私鑰密碼)要謹(jǐn)慎保存
第4步,驗(yàn)證域名信息
第5步,提交申請(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容