GmSSL 是一個開源(遵循 BSD 協議)的密碼工具箱,支持 SM2 / SM3 / SM4 / SM9 / ZUC 等國密(國家商用密碼)算法、SM2 國密數字證書及基於 SM2 證書的 SSL / TLS 安全通信協議,支持國密硬件密碼設備,提供符合國密規范的編程接口與命令行工具,可以用於構建 PKI / CA 、安全通信、數據加密等符合國密標准的安全應用。GmSSL 項目是 OpenSSL 項目的分支,並與 OpenSSL 保持接口兼容。因此 GmSSL 可以替代應用中的 OpenSSL 組件,並使應用自動具備基於國密的安全能力。
國產密碼算法(國密算法)是指國家密碼局認定的國產商用密碼算法,國密算法系列包括 SM1,SM2,SM3,SM4,SM7,SM9 和 ZUC 算法,與國際通用算法標准有對應關系。其中對稱密碼算法包括 SM1,SM4 和 SM7,非對稱密碼算法包括 SM2,SM9,哈希算法包括 SM3。
- SM1 算法:僅支持硬件實現,目前使用范圍逐漸萎縮,目前主要在存量市場有所使用。
- SM2 算法:對標 RSA、ECC 算法,算法標准已公開。
- SM3 算法:對標 MD5、SHA-256 等哈希算法,算法標准已公開。
- SM4 算法:對標 AES,3DES 等算法,算法標准已公開。
- SM7 算法:針對非接觸式 IC 卡、票務、支付卡類應用,算法標准已公開。
- SM9 算法:ZUC 算法屬於對稱密碼算法中的序列密碼算法,以 32 位字為單位輸出密鑰流,其密鑰長度和 IV 長度均為 128 比特。
目錄
1.GmSSL 制作自簽證書
1.1.第一階段:制作 CA 根證書
1.2.第二階段:制作服務器證書
1.3.第三階段:制作客戶端證書(雙向認證使用)
2.Web 容器配置 HTTPS站點
2.1.Tomcat 配置方案
2.2.Nginx 配置方案
2.3.Apache Httpd 配置方案
3.客戶端訪問
3.1.安裝 CA 機構證書
3.2.安裝客戶端 PKCS12 證書(雙向認證使用)
3.3.常見問題
后記一:HTTPS 和 SSL 的概念和工作原理
1.GmSSL 制作自簽證書
1、安裝 GmSSL。
1)驗證並安裝依賴軟件。通過源代碼編譯的方式安裝 GmSSL,需要依賴軟件"make"、"gcc",驗證或安裝依賴軟件:
$ sudo yum install make gcc
補充知識:
① "gcc"是一個C/C++、FORTRAN、JAVA、OBJC、ADA等多種語言的編譯器,用來將源代碼編譯成可發布的軟件程序。
② "make"是一個工程管理工具,能夠根據 Makefile 中的腳本執行編譯、安裝流程。
2)打開 GmSSL 下載頁面【https://github.com/guanzhi/GmSSL】,下載 GmSSL 源代碼 zip 包到用戶主目錄中:
3)解壓縮 GmSSL 的源代碼 zip 包到用戶主目錄下:
$ unzip GmSSL-master.zip $ ll drwxrwxr-x. 24 centos centos 4096 8月 24 21:46 GmSSL-master
4)安裝 GmSSL,進入源代碼目錄,配置、編譯、安裝程序,並拷貝鏈接庫文件("libcrypto.so.1.1"、"libssl.so.1.1")到系統鏈接庫目錄("/lib64")中:
$ cd GmSSL-master $ ./config $ make $ sudo make install $ sudo cp libcrypto.so.1.1 libssl.so.1.1 /lib64
程序安裝目錄是"/usr/local/bin"。
5)查看 GmSSL 的鏈接庫文件是否正常:
$ ldd /usr/local/bin/gmssl linux-vdso.so.1 => (0x00007fffc0cc2000) libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007f9fd0a46000) libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f9fd04f2000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f9fd02ee000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9fd00d2000) libc.so.6 => /lib64/libc.so.6 (0x00007f9fcfd04000) /lib64/ld-linux-x86-64.so.2 (0x00007f9fd0cbd000)
2、創建 SSL 工作目錄。
證書包括 CA 認證機構、服務器和客戶端三類證書的制作,在 SSL 工作根目錄下分別建立"ca"、"server"、"client"子目錄存放對應的輸出文件,並設置所有者為證書管理賬戶。
$ sudo mkdir -p /data/ssl/ca $ sudo mkdir -p /data/ssl/server $ sudo mkdir -p /data/ssl/client $ sudo chown -R centos:centos /data/ssl
3、術語說明
1.1.第一階段:制作 CA 根證書
1、制作 CA【秘鑰】。
$ gmssl ecparam -genkey -name sm2p256v1 -out /data/ssl/ca/ca.key
說明:
- 【openssl ecparam】表示制作秘鑰。
- 【-genkey】表示生成一個 EC 秘鑰;
- 【-name】表示 EC 密碼的算法。
- 【-out】表示秘鑰的輸出文件。
查看 CA 秘鑰文件:
gmssl ec -in /data/ssl/ca/ca.key
2、制作 CA 【根證書簽名申請】。
輸入 CA 秘鑰文件,輸出 CA 根證書簽名申請文件。
操作過程:驗證 CA 秘鑰口令 => 設置國家名稱 => 設置省份名稱 => 設置城市名稱 => 設置組織機構名稱 => 設置組織單元名稱 => 設置證書名稱 => 設置電子郵件地址和擴展屬性(密碼提示信息和可選的公司名稱)。
$ gmssl 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 []:
說明:
- 【openssl req】表示制作證書簽名申請。
- 【-new】表示生成證書請求文件;
- 【-key】表示秘鑰的輸入文件;
- 【-out】表示證書簽名申請的輸出文件。
注意:【Common Name】應為 CA 機構的名稱。
查看 CA 證書申請文件:
$ gmssl req -in /data/ssl/ca/ca.csr -noout -text
3、生成 CA 自簽【根證書】,即對簽名申請進行自簽生成證書。
輸入 CA 秘鑰文件、CA 根證書簽名申請,輸出 CA 自簽根證書文件。
$ gmssl x509 -req -days 3650 -sm3 -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
說明:
- 【openssl x509】表示制作自簽證書。
- 【-req】表示輸入文件的類型是證書簽名申請;
- 【-days】表示證書的有效期,單位是天;
- 【-sm3】表示使用 SM3 加密算法進行簽名;
- 【-signkey】表示簽名秘鑰的輸入文件;
- 【-in】表示證書簽名申請的輸入文件;
- 【-out】表示證書的輸出文件。
查看 CA 證書文件:
$ gmssl x509 -in /data/ssl/ca/ca.pem -noout -text
4、導出 CA【 PKCS12 證書】。
輸入 CA 自簽的 CA 證書文件、CA 秘鑰,輸出 CA PKCS12 證書。
操作過程:設置 PKCS12 證書口令。
$ 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:
說明:
- 【openssl pkcs12】表示制作 PKCS12 證書。
- 【-export 】表示導出 PKCS12 證書;
- 【-in】表示簽名證書的輸入文件;
- 【-inkey】表示秘鑰的輸入文件;
- 【-name】表示 PKCS12 證書的別名;
- 【-out】表示 PKCS12 證書的輸出文件。
查看 CA PKCS12 證書文件(需要輸入 CA PKCS12 證書口令):
$ gmssl pkcs12 -in /data/ssl/ca/ca.p12 -info Enter Import Password: ...... Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ......
5、查看 CA 產生的全部文件。
$ ls /data/ssl/ca/ ca.csr ca.key ca.p12 ca.pem
1.2.第二階段:制作服務器證書
1、制作服務器【秘鑰】。
$ gmssl ecparam -genkey -name sm2p256v1 -out /data/ssl/server/server.key
說明:
- 【openssl ecparam】表示制作秘鑰。
- 【-genkey】表示生成一個 EC 秘鑰;
- 【-name】表示 EC 密碼的算法。
- 【-out】表示秘鑰的輸出文件。
查看服務器秘鑰文件:
gmssl ec -in /data/ssl/server/server.key
2、制作服務器【證書簽名申請】。
輸入服務器秘鑰文件,輸出服務器證書簽名申請文件。
操作過程:驗證服務器秘鑰口令 => 設置國家名稱 => 設置省份名稱 => 設置城市名稱 => 設置組織機構名稱 => 設置組織單元名稱 => 設置證書名稱 => 設置電子郵件地址和擴展屬性(密碼提示信息和可選的公司名稱)。
$ gmssl 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 []:
說明:
- 【openssl req】表示制作證書簽名申請。
- 【-new】表示生成證書請求文件;
- 【-key】表示秘鑰的輸入文件;
- 【-out】表示證書簽名申請的輸出文件。
注意:【Common Name】應為服務器的 IP 地址或者 DNS(如:192.168.216.128 或者 localhost)。在 在 Web 容器配置后,當客戶端使用 HTTPS 協議訪問時,如果域名與【Common Name】不一致,則會進行風險提示。
查看服務器證書申請文件:
$ gmssl req -in /data/ssl/server/server.csr -noout -text
3、生成 CA 簽名的服務器【證書】,即 CA 對服務器簽名申請進行簽名生成服務器證書。
輸入 CA 根證書文件、 CA 秘鑰文件、服務器證書簽名申請,輸出 CA 簽名的服務器證書文件。
$ gmssl x509 -req -days 3650 -sm3 -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
說明:
- 【openssl x509】表示制作 CA 簽名的證書。
- 【-req】表示輸入文件的類型是證書簽名申請;
- 【-days】表示證書的有效期,單位是天;
- 【-sm3】表示使用 SM3 加密算法進行簽名;
- 【-CA】表示 CA 根證書的輸入文件;
- 【-CAkey】表示 CA 秘鑰的輸入文件;
- 【-CAcreateserial】表示如果 CA 序列號文件不存在自動創建;
- 【-in】表示證書簽名申請的輸入文件;
- 【-out】表示證書的輸出文件。
查看服務器證書文件:
$ gmssl x509 -in /data/ssl/server/server.pem -noout -text
使用 CA 證書驗證服務器證書文件:
$ gmssl verify -CAfile /data/ssl/ca/ca.pem /data/ssl/server/server.pem /data/ssl/server/server.pem: OK
4、導出服務器【 PKCS12 證書】。
輸入 CA 簽名的服務器證書文件、服務器秘鑰,輸出服務器 PKCS12 證書。
操作過程:設置 PKCS12 證書口令。
$ gmssl pkcs12 -export -in /data/ssl/server/server.pem -inkey /data/ssl/server/server.key -out /data/ssl/server/server.p12 -name https_cert Enter Export Password: Verifying - Enter Export Password:
說明:
- 【openssl pkcs12】表示制作 PKCS12 證書。
- 【-export 】表示導出 PKCS12 證書;
- 【-in】表示簽名證書的輸入文件;
- 【-inkey】表示秘鑰的輸入文件;
- 【-name】表示 PKCS12 證書的別名;
- 【-out】表示 PKCS12 證書的輸出文件。
查看服務器 PKCS12 證書文件(需要輸入服務器 PKCS12 證書口令):
$ gmssl pkcs12 -in /data/ssl/server/server.p12 -info Enter Import Password: ...... Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ......
5、查看服務器產生的全部文件。
$ ls /data/ssl/server server.csr server.key server.p12 server.pem
1.3.第三階段:制作客戶端證書(雙向認證時使用)
1、制作客戶端【秘鑰】。
$ gmssl ecparam -genkey -name sm2p256v1 -out /data/ssl/client/client.key
說明:
- 【openssl ecparam】表示制作秘鑰。
- 【-genkey】表示生成一個 EC 秘鑰;
- 【-name】表示 EC 密碼的算法。
- 【-out】表示秘鑰的輸出文件。
查看客戶端秘鑰文件:
gmssl ec -in /data/ssl/client/client.key
2、制作客戶端【證書簽名申請】。
輸入客戶端秘鑰文件,輸出客戶端證書簽名申請文件。
操作過程:驗證客戶端秘鑰口令 => 設置國家名稱 => 設置省份名稱 => 設置城市名稱 => 設置組織機構名稱 => 設置組織單元名稱 => 設置證書名稱 => 設置電子郵件地址和擴展屬性(密碼提示信息和可選的公司名稱)。
$ gmssl 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 []:
說明:
- 【openssl req】表示制作證書簽名申請。
- 【-new】表示生成證書請求文件;
- 【-key】表示秘鑰的輸入文件;
- 【-out】表示證書簽名申請的輸出文件。
注意:【Common Name】應為客戶端的統一標識。
查看客戶端證書申請文件:
$ gmssl req -in /data/ssl/client/client.csr -noout -text
3、生成 CA 簽名的客戶端【證書】,即 CA 對客戶端簽名申請進行簽名生成客戶端證書。
輸入 CA 根證書文件、 CA 秘鑰文件、客戶端證書簽名申請,輸出 CA 簽名的客戶端證書文件。
$ gmssl x509 -req -days 3650 -sm3 -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
說明:
- 【openssl x509】表示制作 CA 簽名的證書。
- 【-req】表示輸入文件的類型是證書簽名申請;
- 【-days】表示證書的有效期,單位是天;
- 【-sm3】表示使用 SM3 加密算法進行簽名;
- 【-CA】表示 CA 根證書的輸入文件;
- 【-CAkey】表示 CA 秘鑰的輸入文件;
- 【-CAcreateserial】表示如果 CA 序列號文件不存在自動創建;
- 【-in】表示證書簽名申請的輸入文件;
- 【-out】表示證書的輸出文件。
查看客戶端證書文件:
$ gmssl x509 -in /data/ssl/client/client.pem -noout -text
使用 CA 證書驗證服務器證書文件:
$ gmssl verify -CAfile /data/ssl/ca/ca.pem /data/ssl/client/client.pem /data/ssl/client/client.pem: OK
4、導出客戶端【 PKCS12 證書】。
輸入 CA 簽名的客戶端證書文件、客戶端秘鑰,輸出客戶端 PKCS12 證書。
操作過程:設置 PKCS12 證書口令。
$ gmssl pkcs12 -export -in /data/ssl/client/client.pem -inkey /data/ssl/client/client.key -out /data/ssl/client/client.p12 -name https_client Enter Export Password: Verifying - Enter Export Password:
說明:
- 【openssl pkcs12】表示制作 PKCS12 證書。
- 【-export 】表示導出 PKCS12 證書;
- 【-in】表示簽名證書的輸入文件;
- 【-inkey】表示秘鑰的輸入文件;
- 【-name】表示 PKCS12 證書的別名;
- 【-out】表示 PKCS12 證書的輸出文件。
查看客戶端 PKCS12 證書文件(需要輸入服務器 PKCS12 證書口令):
$ gmssl pkcs12 -in /data/ssl/client/client.p12 -info Enter Import Password: ...... Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ......
5、查看客戶端產生的全部文件。
$ ls /data/ssl/client client.csr client.key client.p12 client.pem
2.Web 容器配置 HTTPS 站點
2.1.Tomcat 配置方案
1、安裝並配置 Tomcat 。
sudo tar zxvf apache-tomcat-9.0.34.tar.gz -C /usr/local sudo mv /usr/local/apache-tomcat-9.0.34 /usr/local/tomcat-9.0.34 sudo gedit /usr/local/tomcat-9.0.34/conf/server.xml
在文件中的增加以下配置並保存(服務器認證):
<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>
在文件中的增加以下配置並保存(雙向認證):
<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、啟動/重新啟動 Tomcat 。
$ sudo /usr/local/tomcat-9.0.34/bin/startup.sh $ sudo /usr/local/tomcat-9.0.34/bin/shutdown.sh && /usr/local/tomcat-9.0.34/bin/startup.sh
2.2.Nginx 配置方案
1、安裝並配置 Nginx 。
$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel $ tar -zxvf nginx-1.18.0.tar.gz $ cd nginx-1.18.0 $ ./configure --with-http_ssl_module $ make $ sudo make install $ sudo gedit /usr/local/nginx/conf/nginx.conf
在文件中的增加以下配置並保存:
http { server { listen 80; listen 443 ssl; server_name localhost; # 服務器簽名證書文件 ssl_certificate /data/ssl/server/server.pem; # 服務器秘鑰文件 ssl_certificate_key /data/ssl/server/server.key; # 開啟客戶端證書認證(雙向認證) # ssl_verify_client on; # CA 證書(雙向認證) # 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、啟動/重新啟動 Nginx 服務器。
$ sudo /usr/local/nginx/sbin/nginx $ sudo /usr/local/nginx/sbin/nginx -s reload
2.3.Apache Httpd 配置方案
1、安裝並配置 Apache Httpd。
$ sudo dnf install httpd $ sudo dnf install mod_ssl openssl $ sudo setenforce 0 $ sudo gedit /etc/httpd/conf.d/ssl.conf
在文件中的編輯以下配置並保存:
# 監聽端口 Listen 443 https # Https 根路徑 DocumentRoot "/var/www/html" # 服務器域名 ServerName localhost # 服務器簽名證書文件 SSLCertificateFile /data/ssl/server/server.pem # 服務器秘鑰文件 SSLCertificateKeyFile /data/ssl/server/server.key # 開啟客戶端證書認證(雙向認證) # SSLVerifyClient require # CA 證書(雙向認證) # SSLCACertificateFile /data/ssl/ca/ca.pem
2、啟動/重新啟動 Apache Httpd 服務器。
$ sudo systemctl start httpd.service $ sudo systemctl restart httpd.service
3.客戶端配置
3.1.安裝 CA 機構證書

第1步

第2步
第3步

第4步
第5步

第6步
3.2.安裝客戶端 PKCS12 證書(雙向認證使用)
1、參照章節"3.1.安裝 CA 機構證書",安裝 CA 機構證書。
2、安裝客戶端 PKCS12 證書。

第1步

第2步

第3步

第4步

第5步

第6步
Nginx配置SSL證書部署https支持
免費ssl證書申請
申請免費的SSL證書
沃通、阿里雲 申請免費的SSL證書
下載www.iamle.com.zip文件,解壓文件,找到for Nginx.zip解壓,得到2個文件
1_www.iamle.com_bundle.crt ,2_www.iamle.com.key
改個名字www.iamle.com.crt,www.iamle.com.key傳到服務器上備用
找到對應的server,增加listen 443 ssl; ssl on; ssl_certificate /usr/local/nginx/conf/ssl/www.iamle.com.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/www.iamle.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on;
重新載入nginx配置
# /etc/init.d/nginx reload
轉換pfx為nginx需要的crt,key
如果已經有一個擴展名為pfx的證書,那么需要轉換使用
# openssl pkcs12 -in www.iamle.com.pfx -nocerts -nodes -out www.iamle.com.key Enter Import Password: 輸入證書密碼 MAC verified OK # openssl pkcs12 -in www.iamle.com.pfx -clcerts -nokeys -out www.iamle.com.crt Enter Import Password: 輸入證書密碼 MAC verified OK
生成2個文件 www.iamle.com.key , www.iamle.com.pfx 復制到你指定的目錄
https://www.jianshu.com/p/983ee30af32c 大佬文章