日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

证书类型、自签CA证书、https双向认证(一篇就懂系列)

發布時間:2023/12/4 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 证书类型、自签CA证书、https双向认证(一篇就懂系列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#博學谷IT學習技術支持#

文章目錄

  • 1.Linux準備環境
  • 2.證書擴展名
  • 3.自簽CA證書
    • 3.1 生成根證書
    • 3.2 生成服務端證書
    • 3.3 生成客戶端證書
  • 4.開啟https,并校驗客戶端(雙向認證)
    • 4.1配置nginx,開啟https
    • 4.2開啟客戶端認證
  • 5.java代碼

最近在做接口對接的時候,需要雙方使用https協議以及客戶端認證(https雙向認證)。雖然之前接觸過https,了解一些https的原理以及加密算法,但是實際操作起來還是會多多少少的遇到一些問題。因此,將遇到的問題記錄下來,方便后續的閱讀和查找。也希望大家能夠更快的理解。

參考:

linux環境安裝nginx
pem和der文件擴展名轉換

1.Linux準備環境

  • openssl

使用openssl version查看openssl版本,如果沒有安轉openssl,可以執行 yum install openssl 安裝

  • nginx

我們使用nginx來進行https的雙向認證,首先我們需要安裝nginx并附帶SSL 模塊
詳細的安裝過程可以查看 Linux安裝nginx ssl

2.證書擴展名

在開發和測試階段,使用的是自簽的證書。在找自簽CA證書操作流程的時候,會有很多的文件擴展名,如pem,der,csr.cer.crt.p12,pfx,jks等,剛開始接觸的話很容易混淆,因此先來看下證書的擴展名。

  • DER: .DER = DER擴展用于二進制DER編碼證書。這些文件也可能承載CER或CRT擴展。
  • PEM:使?Base64 ASCII進?編碼的純?本格式,是以“ - BEGIN …”前綴的ASCII(Base64)數據。
  • KEY:.KEY 擴展名用于公鑰和私鑰,常見使用于私鑰。也可以被編碼為二進制DER或ASCII PEM。
  • CSR:證書簽名請求。CSR文件是申請SSL證書時所需要的一個數據文件。
  • CRT:CRT擴展用于證書。 證書可以被編碼為二進制DER或ASCII PEM。 CER和CRT擴展幾乎是同義詞。 最常見的于Unix 或類Unix系統。通俗來講,.CRT文件常在Linux系統使用,包含公鑰和主體信息。
  • CER:.CRT的替代形式,您可以在微軟系統環境下將.CRT轉換為.CER(.both DER編碼的.CER,或base64 [PEM]編碼的.cer)。通俗來講,就是.CER擴展文件是DER編碼,并且.CER文件常在Windows系統使用。
  • P12:P12證書全稱是PKCS#12。是一種交換數字證書的加密標準,用來描述個人身份信息。p12證書包含了私鑰、公鑰并且有口令保護,在證書泄露后還有最后一道保障——證書口令,不知道正確的證書口令無法提取秘鑰(文件的擴展名能夠為pfx或p12)?
  • PFX:PFX也是由PKCS#12標準定義,包含了公鑰和私鑰的二進制格式的證書形式,以pfx做為證書文件后綴名(文件的擴展名能夠為pfx或p12)
  • JKS:JKS是JAVA的keytools證書工具支持的證書私鑰格式

3.自簽CA證書

3.1 生成根證書

mkdir ssl 創建證書存放的?錄
cd ssl 進?證書存放?錄

生成私鑰
openssl genrsa -out ca.key 2048 ?成根證書私鑰
查看一下ca.key 的內容,可以看到

可以將ca.key轉為pem文件
openssl rsa -in ca.key -out ca-key.pem
再查看一下ca-key.pem文件,內容和ca.key是相同的

生成根證書
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
-days設置證書有效時間,這里我們設置10年
生成證書時要輸入一些個體信息
證書生成后,可以查看ca.crt的內容

也可以將ca.crt轉為pem文件
openssl x509 -in ca.crt -out ca-crt.pem
再查看一下ca-crt.pem文件,內容和ca.crt是相同的

編碼類型轉換
PEM編碼轉為DER編碼 openssl x509 -in ca-crt.pem -outform der -out ca-crt.der
DER轉為PEM openssl x509 -in ca-crt.der -inform der -outform pem -out ca-crt.pem
(提示:要轉換KEY文件也類似)
der二進制編碼的文件不能直接查看,可以使用命令查看.der文件
openssl x509 -in ca-crt.der -inform der -text -noout

3.2 生成服務端證書

為了便于理解和操作,這里統一使用pem編碼,并統一生成pem格式擴展文件

生成服務端私鑰
生成pem擴展名的私鑰
openssl genrsa -out server-key.pem 2048
2048表示生成的私鑰為2048位,一般使用2048位相對比較安全

將.pem擴展名私鑰轉為.key
openssl rsa -in server-key.pem -out server.key
再查看server.key 和server.pem 私鑰內容是相同的

生成服務端證書簽名請求文件
注意這?的common name必須是需要訪問的域名,其他的內容可以和根證書填寫的?樣
openssl req -new -key server-key.pem -out server-csr.pem

可以將server-csr.pem轉為.csr擴展名
openssl req -in server-csr.pem -out server.csr 或直接修改擴展名 .pem為.csr

根據簽發請求?成服務端證書
openssl x509 -req -sha256 -in server-csr.pem -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server-crt.pem

可以將server-crt.pem轉為.crt擴展名
openssl x509 -outform pem -in server-crt.pem -out server.crt

生成服務端pfx或p12證書
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pfx

注:在將.pem擴展文件轉為key,csr,crt文件的時候,先查看文件內容
包含 -----BEGIN RSA PRIVETE KEY ----- 的內容可以導出轉換.key擴展名的文件
包含 -----BEGIN CERTIFICATE REQUEST ----- 的內容可以導出轉換.csr擴展名的文件
包含 -----BEGIN CERTIFICATE ----- 的內容可以導出轉換.crt擴展名的文件

3.3 生成客戶端證書

客戶端證書?成步驟和服務端基本?樣,需要注意的就是在?成簽發請求的時候填寫的信息中,comm name也要是訪問的域名。

生成客戶端私鑰
openssl genrsa -out client.key 2048

生成客戶端證書簽名請求文件
openssl req -new -key client.key -out client.csr

根據簽發請求和?成客戶端證書
openssl x509 -req -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out client.crt

生成客戶端pfx或p12證書
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12

4.開啟https,并校驗客戶端(雙向認證)

4.1配置nginx,開啟https

  • 開啟https請求

進入nginx目錄,編輯nginx.conf – vim nginx.conf
找到HTTPS server
ssl_certificate 服務端crt證書路徑
ssl_certificatie_key 服務端私鑰路徑

配置完以后 啟動或者容器一下nginx
啟動:在nginx目錄執行 ./sbin/nginx
重啟:在nginx目錄執行 ./sbin/nginx -s reload
在瀏覽器訪問是成功的,因為我們是自簽證書,因此顯示不安全

4.2開啟客戶端認證

vim nginx.conf繼續編輯nginx.conf
ssl_client_certificate 指定客戶端認證時使?的根證書路徑,?來驗證客戶端證書的正確性,我們使用的自簽ca證書簽發的客戶端證書,因此使用ca.crt
ssl_verify_client on 為開啟客戶端校驗

配置完成后重啟nginx ./sbin/nginx -s reload
為了方便測試。我們直接使用curl 命令進行測試
curl https://ip -k -v
ip為訪問的具體ip地址
-k編碼忽略服務端證書的校驗,因為我們這里服務端證書也是自簽的,所以要加上-k
不加-k,會有異常提示

-v為顯示具體的信息,也可以不加
使用上述命令訪問后

提示需要攜帶客戶端的證書,說明我們配置的客戶端認證已經生效了
curl --cert client.crt --key client.key https://ip -k

可以看到攜帶證書后訪問是成功的,說明客戶端已經認證成功了,因此https雙向認證完成了

5.java代碼

附一段java代碼,代碼來自 https://wenku.baidu.com/view/ee8e04315c0e7cd184254b35eefdc8d376ee1494.html

public class SSLService {// 客戶端證書路徑,?了本地絕對路徑,需要修改private final static String CLIENT_CERT_FILE = "C:\\Users\\tzx\\Desktop\\client.p12";// 客戶端證書密碼private final static String CLIENT_PWD = "131112";// 信任庫路徑,即keytool?成的那個?定義名稱的庫?件private final static String TRUST_STRORE_FILE = "D:\\Java\\jdk1.8.0_131\\jre\\lib\\security\\test.truststore";// 信任庫密碼,即keytool時的密碼private final static String TRUST_STORE_PWD = "131112";private static String readResponseBody(InputStream inputStream) throws IOException {try {BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));StringBuffer sb = new StringBuffer();String buff = null;while ((buff = br.readLine()) != null) {sb.append(buff + "\n");}return sb.toString();} finally {inputStream.close();}}public static void httpsCall() throws Exception {// 初始化密鑰庫KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");KeyStore keyStore = getKeyStore(CLIENT_CERT_FILE, CLIENT_PWD, "PKCS12");keyManagerFactory.init(keyStore, CLIENT_PWD.toCharArray());// 初始化信任庫TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");KeyStore trustkeyStore = getKeyStore(TRUST_STRORE_FILE, TRUST_STORE_PWD, "JKS");trustManagerFactory.init(trustkeyStore);// 初始化SSL上下?SSLContext ctx = SSLContext.getInstance("SSL");ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);SSLSocketFactory sf = ctx.getSocketFactory();HttpsURLConnection.setDefaultSSLSocketFactory(sf);String url = "https://blog.tzx.com";URL urlObj = new URL(url);HttpsURLConnection con = (HttpsURLConnection) urlObj.openConnection();con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 " +"(KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");con.setRequestProperty("Accept-Language", "zh-CN;en-US,en;q=0.5");con.setRequestMethod("GET");String res = readResponseBody(con.getInputStream());System.out.println(res);}/*** 獲得KeyStore*/private static KeyStore getKeyStore(String keyStorePath, String password, String type)throws Exception {FileInputStream is = new FileInputStream(keyStorePath);KeyStore ks = KeyStore.getInstance(type);ks.load(is, password.toCharArray());is.close();return ks;}public static void main(String[] args) throws Exception {httpsCall(null);}
}

總結

以上是生活随笔為你收集整理的证书类型、自签CA证书、https双向认证(一篇就懂系列)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。