使用OpenSSL實現CA證書的搭建過程

個人博客地址:http://www.pojun.tech/ 歡迎訪問

什麼是CA

CA,Catificate Authority,通俗的理解就是一種認證機制。它的作用就是提供證書(也就是服務端證書,由域名,公司信息,序列號,簽名信息等等組成)來加強客戶端與服務器端訪問信息的安全性,同時提供證書的發放等相關工作。國內的大部分互聯網公司都在國際CA機構申請了CA證書,並且在用戶進行訪問的時候,對用戶的信息加密,保障了用戶的信息安全。理論上來說,任何組織或者個人都可以扮演CA的角色,只不過,難以得到客戶端的信任,不能推而廣之,最典型應用莫過於12306網站,這個網站就是自己給自己頒發的根證書。
目前能夠讓瀏覽器默認支持的CA大廠有很多,Windows 操作系統在安裝之初,也默認安裝了很多受信任的根證書。可以通過控制面板–Internet選項來進行查看。

windows默認安裝的根證書預覽

SSL/TLS

SSL/TLS是網絡通信過程中非常重要的兩個協議。互聯網的通信安全就建立在SSL/TLS協議基礎之上。他們通過一系列的加密行爲保障了通信的安全,是如今互聯網通信最主要的應用之一。

SSL/TLS是一個很大的互聯網應用,關於他們的介紹互聯網上有很多,我們暫時不做詳細的介紹。關於SSL/TLS通信的過程大致可以用下面的這張圖來進行描述。

SSL/TLS通信示意圖

OpenSSL

OpenSSL是一套開源軟件,在Linux中可以很容易的安裝。它能夠很容易的完成密鑰生成以及證書管理。我們接下來就利用OpenSSL搭建CA證書,並實現證書的申請與分發。

OpenSSL實現CA證書的搭建

  • 實驗環境的準備

  • CA的配置介紹

  • 創建所需要的文件

  • CA 自簽名證書

  • 頒發證書

  • 查看證書狀態

  • 證書吊銷

實驗環境的準備

首先我們應該準備三個虛擬機,他們分別用來表示根CA證書機構,以及子CA證書機構,和證書申請用戶。 那麼問題來了,用戶向子CA證書機構申請證書,子CA機構向根CA機構申請授權,根CA是如何取得證書的呢?答案是根CA自己給自己頒發的證書。 實驗環境的拓撲結構如下圖所示。

實驗拓撲圖

CA配置介紹

要手動創建CA證書,就必須首先了解,OpenSSL中關於CA的配置,配置文件位於下面的/etc/pki/tls/openssl.cnf

####################################################################
[ ca ]
default_ca= CA_default		#默認CA
####################################################################
[ CA_default ]
dir=/etc/pki/CA		 # CA的工作目錄這裏其實是定義了一個變量
certs= $dir/certs        # 證書存儲路徑
crl_dir= $dir/crl	 # 證書吊銷列表
database= $dir/index.txt # 證書數據庫列表

new_certs_dir= $dir/newcerts	#新的證書路徑
certificate= $dir/cacert.pem 	# CA自己的證書
serial= $dir/serial 		#下一個證書的編號,十六進制,默認00
crlnumber= $dir/crlnumber	#下一個要被吊銷的證書編號,十六進制,默認00
crl= $dir/crl.pem 		# The current CRL
private_key= $dir/private/cakey.pem # CA 的私鑰
RANDFILE= $dir/private/.rand	# private random number file
x509_extensions	= usr_cert	# The extentions to add to the cert


# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default		# 命名方式
cert_opt = ca_default		# CA的選項

# Extension copying option: use with caution.
# copy_extensions = copy


# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions= crl_ext
default_days= 365			# 默認證書的有效期限
default_crl_days= 30			# how long before next CRL
default_md= default		# use public key default MD
preserve= no			# keep passed DN ordering


# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy= policy_match  	#策略
			#這裏記錄的是 將來CA在搭建的時候,以及客戶端申請證書的時候,需要提交的信息的匹配程度。

# For the CA policy
[ policy_match ]			# match意味着CA以及子CA必須一致
countryName	= match			# 國家
stateOrProvinceName= match		# 州或者省
organizationName= match			#組織公司
organizationalUnitName	= optional
commonName= supplied
emailAddress= optional

# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]		#可以對外提供證書申請,這時,證書的匹配就可以不用那麼嚴格
countryName= optional
stateOrProvinceName= optional
localityName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional

創建所需要的文件

這裏有一點需要注意,我們的實驗環境中包含了三個主機,其中兩個的角色是作爲CA認證機構存在的,所以創建所需要的文件的時候,主機A和主機B都需要創建。 如果不提前創建這兩個文件,那麼在生成證書的過程中會出現錯誤。 我們將文件創建在配置文件中指定的路徑下面。

  • 生成證書索引數據庫文件 touch /etc/pki/CA/index.txt

  • 指定第一個頒發證書的序列號 echo 01 > /etc/pki/CA/serial

CA 自簽名證書(構造根CA)

首先構造根CA的證書。因爲沒有任何機構能夠給根CA頒發證書,所以只能根CA自己給自己頒發證書。

首先生成私鑰文件

私鑰文件是非常重要的文件,除了自己本身以外,其他任何人都不能取得。所以在生成私鑰文件的同時最好修改該文件的權限,並且採用加密的形式進行生成。

# 執行命令生成私鑰文件。
# 採用了des3的方式對私鑰文件進行了加密
# 同時臨時指定了umask ,使得生成的私鑰文件只對自己具有讀寫權限。
[root@localhost ~]#(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048 )
Generating RSA private key, 2048 bit long modulus
...............+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for /etc/pki/CA/private/cakey.pem:	#這裏需要輸入密碼
Verifying - Enter pass phrase for /etc/pki/CA/private/cakey.pem:	#這裏確認密碼

#  查看一個生成的私鑰文件,就會發現已經被加密了
[root@localhost ~]#cat /etc/pki/CA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A4FB61EACD1544F2

9JrKVEPhnWhx1W+W1V4PdIvVHNDwb8mb0JYILvXZKc07gvNcYKIlvUoTxjtihbpk
wYQcVm0Z6b2+fjZBXVVR9igFB2OOE74BnSNMsbfPTs5W/SwWLxv0R6x0SbiZ8v/7
D6Qh3u/rXmOQWWTvQnLzh6JaT00c8zgUnn48vMev17Xyg32oJqKqJVL5RNBGmJur
6CaWX8mB5q+HYiBUXzNLQp9T3HNGcnmDNyk0gylEvjeJo3Hq+IOAkjfJE4sYO9ER
tQtsLViFUc5jXX7p0nIO0ANwE7zdjBt9I4aXknZiC4rFYJJtNSa1Wrhoo/MhuwWH
zjc4UyoB1C71sbq2LMgeElHhXN/TfqWGfXFqhkyBJwgrmzQibOJSFeWHZNurILof
UwgNLlABmazvIL5Ps6LgZtyrO2ODSDTzPiCO7kQ0S3mTHYk9+WEeEyMb4uum6oAx
oCofADL0wea+5mHVUA2s6KwRBFr01HiQ00fiul6LFvXdCwt9IL62blIJYn2veQHl
oPvC5cTnPVqJ28GJWbPvJjiOLB8Hh+4DPwxaRA1eYf2R9SR0R1SYJIBTI6NNqNwW
Lq+pD89bGCbFdYID+kAZfG27FonmmLvvhTn3jQKVPpwQBROHQ9gpwMLnpmpJWwNK
byUSit+Vt+mvbzOLjuTdsTzklwZEOkNpaE/jTqusWuhXS33D4bqA+Ws+xNVDnx6e
rbrGcbX9skXyti21oEIYem0H37ZS2fV9z+/CM/55maOX5xNVQ4aDxWuiMyyUd03D
nhhM5A4mcDvIZLpWDbHzjtkl2H9Pnb9fvGzOIOm7lVQrX8BdidpWjwGTLYG/zUX5
i9NimSnoiqgkhEYl8KXzbnMfD4hX69BXI7le5HAaS38wDKPsmRRW/dgGfRNKzfTZ
qmBimscMsllz21QnG9eqineFDdexGZw1oEQsHp2CivtEwaIKTqOZfNiwHJvm1cbz
M0NOgs+r2qze0czV9dTqM5pVND1Iac1DXYflYZ9g54riQNre/sHp1qpdNQHRRMTP
yTFnGsEfWmI4V4HiSrdQpyHIrnFUryse9kJmRKDfQK7icUf5/KrOD4FOS5zsHrep
/cE14w7s0Zqko9upkYQNBys5TbBmAK8yVJ/Zq7jU3qjDxkYNddpOt8k33vl9CG53
OeWxcWOzJCHIOjakJlLnS+XitsSY4hzUlfEO0/Ffi99zyHXybNPws5Og4KNfgcqW
ReG943oKc5qplfST2tr0K10ipD3WoV+lMbLugrwhfmVOyHGypfJhUMU0oKEjYPP3
JjHSiW0hrnNvrPQ4/mqSps3LyWYZWvH40N88U6dbxgbUgamXLHWtzJdyfBNii8uH
obtye7oeYpAzx0hNurXhpSoswFbxwU5u80eL0/YkfkzkL1P9vtMvDUw/TVNbwHVg
kTS9WEQA52XLMBtanzRzLGJVIXX6ODGgXt2Gql3KO1p43OyZq4Ksvyj8NuvdmBdO
y9SrMvv+cdOMmTkj4nmGBjqSDeFmrSSQf0HoUbfXXXw/RIW/gkcm4qPmNJXUolYp
WBOg5jT78pcJ2sRwb6YQDgC5HleBwuZujixUlKgdZxF1DEpJNBFnNDxq8yKadEzB
-----END RSA PRIVATE KEY-----

生成自簽名證書

私鑰文件是非常重要的文件,除了自己本身以外,其他任何人都不能取得。所以在生成私鑰文件的同時最好修改該文件的權限,並且採用加密的形式進行生成。

# 調用命令生成一個簽名證書
# 生成證書的過程中需要輸入之前設定的私鑰的密碼
# -new: 生成新證書籤署請求
# -x509: 專用於CA生成自簽證書
# -key: 生成請求時用到的私鑰文件
# -days n:證書的有效期限
# -out /PATH/TO/SOMECERTFILE: 證書的保存路徑
[root@localhost ~]#openssl req -new -x509 -key  /etc/pki/CA/private/cakey.pem -days 7300 -out  /etc/pki/CA/cacert.pem
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
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) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ca.pojun.tech
Email Address []:

頒發證書

頒發證書這裏我們將分成兩個環節介紹,分別是 子CA證書機構向根CA證書機構申請證書以及普通用戶向子CA證書機構申請證書。

子CA證書機構向根CA申請證書

A 在需要使用證書的主機上生成證書請求

首先在B主機上生成私鑰,這一個過程與前面根CA機構生成私鑰的過程是一致的。

# 這次我們修改了私鑰的長度
# 並且沒有采用加密的方式生成
# 因爲主機B是要作爲子CA機構的形式存在,他也是一個CA,所以生成私鑰的時候,就應該按照配置文件中指定的內容,生成cakey.pem
[root@centos6 pki]$(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 1024)
Generating RSA private key, 1024 bit long modulus
......++++++
..............++++++
e is 65537 (0x10001)

# 查看私鑰文件可以發現,沒有了加密的標識
# 同時因爲生成時指定了1024的長度,私鑰的長度明顯的變短了。
[root@centos6 ~]$cat /etc/pki/CA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCxLyAKQCkysisrsuou6oJFJHs/Gk9L406x6sON1a2JX3516FJ2
·····中間省略······
R1ogCVEZq36sgNYUwaT55gLKk5Ik5T6YQimy0bsvo5oQuw==
-----END RSA PRIVATE KEY-----

利用私鑰文件,生成證書申請文件。

# 其實這裏的時間是沒有必要指定的。
# 因爲證書的時間,是由頒發機構指定的,因此申請機構填寫了時間也沒用
# 其中有些信息必須要與根證書的內容相同因爲在根證書的openssl.cnf文件中已經指定。
[root@centos6 tls]$openssl req -new -key /etc/pki/CA/private/cakey.pem  -days 3650 -out /etc/pki/tls/subca.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) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:subca.pojun.tech     
Email Address []:

# 這裏的兩步 默認也可以不用填
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:magedu.com

B 將證書的申請文件,傳遞給根CA

將前一步生成的證書的申請文件,傳遞給根CA機構

# 最好將申請文件,傳輸到指定的目錄下,這樣便於管理
[root@centos6 tls]$scp /etc/pki/tls/subca.csr  172.18.253.127:/etc/pki/CA

C CA頒發證書

此時切換到根CA主機,生成證書

# 這裏的時間必須要進行指定。這時證書頒發機構指定的證書的有效期。
# [root@localhost CA]#openssl ca -in /etc/pki/CA/subca.csr -out /etc/pki/CA/certs/subca.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 11 14:38:13 2017 GMT
            Not After : Sep 11 14:38:14 2018 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = shandong
            organizationName          = pojun.tech
            organizationalUnitName    = opt
            commonName                = subca.pojun.tech
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                DB:3E:9C:F4:F4:E9:42:15:00:E7:35:52:FE:04:9A:48:8C:BD:1A:1B
            X509v3 Authority Key Identifier: 
                keyid:01:17:F1:CB:91:4B:20:AD:C7:DF:13:05:A4:D8:83:B2:AB:75:D1:05

Certificate is to be certified until Sep 11 14:38:14 2018 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

#此時查看index.txt 文件中,會看到增加了一條新的記錄。
[root@localhost CA]#cat index.txt
V	180911143814Z		01	unknown	/C=CN/ST=shandong/O=pojun.tech/OU=opt/CN=subca.pojun.tech

D 將根CA生成的證書頒發給請求者

# 主機B是作爲子CA機構存在的,所以證書文件,必須是cacert.pem,否則,子CA將不能夠給其他用戶頒發證書。
[root@localhost CA]#scp  /etc/pki/CA/certs/subca.crt 172.18.250.114:/etc/pki/CA/cacert.pem

普通用戶向子CA機構,申請證書

這一個過程,與子CA向根CA申請證書的過程是類似的。我們將命令的記錄如下

#生成私鑰文件
# 因爲是普通用戶,所以生成的私鑰文件應該與之前的cacert.pem 有所區別 
[root@localhost ~]# (umask 066; openssl genrsa -out /etc/pki/tls/private/app.key 1024)

#利用私鑰文件,生成證書申請文件
[root@localhost ~]# openssl req -new -key /etc/pki/tls/private/app.key  -out /etc/pki/tls/app.csr


# 將證書申請文件發送給 子CA證書頒發機構
[root@localhost ~]# scp /etc/pki/tls/app.csr  172.18.250.114:/etc/pki/CA

# 切換到子CA證書頒發機構
# 子CA證書頒發機構頒發證書
[root@centos6 CA]$openssl ca -in /etc/pki/CA/app.csr -out /etc/pki/CA/certs/app.crt -days 365

#將生成的證書傳遞給申請者
[root@centos6 CA]$scp /etc/pki/CA/certs/app.crt  172.18.253.58:/etc/pki/CA/certs/

這樣,正常的證書頒發流程就算是完成了。將我們生成的根證書,子CA證書以及普通用戶證書導出到Windows系統中,並安裝,然後我們就可以看到,整個證書路徑了。如下圖所示。

CA證書路徑

查看證書狀態

查看證書狀態,使用下面這條命令 ,可以查看證書的內容以及頒發者的多種信息。

openssl x509 -in /etc/pki/CA/cacert.pem -noout -text|issuer|subject|serial|dates

-text   證書的內容
-issuer 證書頒發者的信息
-subject  證書主體的信息
-serial	 證書的序列號信息
-dates 查看證書的時間


# 證書頒發者的信息
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -issuer
issuer= /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech

# 
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -subject
subject= /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech

# 證書的有效時間
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -dates
notBefore=Sep 11 13:43:42 2017 GMT
notAfter=Sep  6 13:43:42 2037 GMT


#也可以根據index.txt 文件中的證書編號,進行查看狀態
[root@localhost ~]#openssl ca -status 01
Using configuration from /etc/pki/tls/openssl.cnf01=Valid (V)

吊銷證書

這裏我們將子CA的證書吊銷掉。

A 首先在子CA主機上獲取到要吊銷的證書的serial

前面的例子中,我們的子CA證書的存放路徑是 /etc/pki/CA/certs/subca.crt

[root@centos6 CA]$openssl x509 -in /etc/pki/CA/certs/subca.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=shandong/O=pojun.tech/OU=opt/CN=subca.pojun.tech

B 在根CA上根據客戶提交的serial與subject信息,對比檢驗是否與index.txt文件中的信息一致,然後吊銷證書

#進入到CA的路徑下,查看文件目錄
[root@localhost CA]#pwd
/etc/pki/CA

[root@localhost CA]#tree
.
├── cacert.pem
├── certs
│   └── subca.crt		# 這是直接頒發給子CA的證書文件├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│   └── 01.pem			#這個就是與子CA證書一致的Serial文件├── private
│   └── cakey.pem
├── serial
├── serial.old
└── subca.csr


# 吊銷子CA的證書 使用revoke 命令
[root@localhost CA]#openssl ca -revoke /etc/pki/CA/newcerts/01.pem 
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Revoking Certificate 01.
Data Base Updated

C 指定第一個吊銷證書的編號

指定吊銷證書的編號,只有在更新證書吊銷列表之前,才需要操作

# 這條命令與生成證書時指定證書serial 號碼的作用是一致的。
# 就是說,指定下一個證書吊銷時的編號。
[root@localhost ~]#echo 01 > /etc/pki/CA/crlnumber
[root@localhost ~]#cat /etc/pki/CA/crlnumber
01

D 更新證書吊銷列表

前面指定了證書吊銷列表編號之後,就可以來更新證書吊銷列表了。

[root@localhost ~]#openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:   #這裏提示輸入密碼

查看證書吊銷列表的文件

[root@localhost ~]#openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text
Certificate Revocation List (CRL):   #證書吊銷列表
        Version 2 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech
        Last Update: Sep 12 11:58:17 2017 GMT
        Next Update: Oct 12 11:58:17 2017 GMT
        CRL extensions:
            X509v3 CRL Number: 
                1
Revoked Certificates:					#這裏的標識顯示,證書已經被吊銷了
    Serial Number: 01					#吊銷的序列號
        Revocation Date: Sep 12 11:52:47 2017 GMT
    Signature Algorithm: sha256WithRSAEncryption
         b4:6e:f2:73:21:ed:c4:38:39:06:29:76:61:ac:d6:ee:a4:5d:
         e8:cb:7c:8b:f8:01:21:ba:bd:b2:46:fa:ea:bf:de:fa:6e:f6:
         85:d6:93:7c:81:b4:2d:d5:eb:c2:94:a3:6f:13:6d:f3:3f:48:
         56:85:72:96:cf:e0:ea:a9:0e:07:43:6d:62:2d:4d:e2:2e:b5:
         02:6a:27:7a:31:76:eb:4e:b1:d6:83:8b:d7:39:10:14:d6:94:
         77:4b:10:d8:24:46:95:1b:48:87:16:77:ce:8c:1b:54:2c:4d:
         ee:2f:24:13:10:62:30:32:74:9e:84:49:c9:dc:a9:fc:31:60:
         57:b5:43:7a:a3:09:75:60:1e:6a:f2:26:e9:54:37:2d:ce:0b:
         ac:b2:41:c2:d9:02:99:fc:a3:99:15:9c:10:a7:f4:be:08:83:
         23:ee:ef:74:83:ea:fd:f7:c9:e1:87:6f:9b:1d:c3:df:88:2d:
         79:2b:71:4b:9e:6f:ae:f9:08:d9:66:d4:f1:49:df:7e:89:99:
         06:a3:86:72:37:02:78:0f:16:e8:87:8a:61:5b:a3:ac:e2:46:
         38:ce:86:29:c9:c6:e5:8c:f8:25:2f:7e:d1:62:13:57:a3:a6:
         10:42:13:b9:e4:0b:fa:9f:f4:d0:95:9b:5d:9b:2d:38:7f:8d:
         ac:c0:e6:3f

在實際的使用過程中,有很多這樣的實例。例如我們經常使用的淘寶,在使用瀏覽器訪問淘寶的時候,就可以查看淘寶的證書吊銷列表。如下圖所示。

淘寶的證書吊銷列表

至此,關於自己搭建CA的過程基本上就完成了。熟悉了上面的操作之後,就可以自己動手簡單的搭建一個證書了,然後也可以體驗一下整個流程

參考資料

http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

http://kb.cnblogs.com/page/197396/



個人博客地址:http://www.pojun.tech/ 歡迎訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章