先把用到的命令行放上來方便備查:
如不需要私鑰密碼,則刪掉 -des3
參數即可
自簽名:
# 1.生成私鑰
$ openssl genrsa -out server.key 2048
# 2.生成 CSR (Certificate Signing Request)
$ openssl req -subj "/C=CN/ST=Tianjin/L=Tianjin/O=Mocha/OU=Mocha Software/CN=test1.sslpoc.com/emailAddress=test@mochasoft.com.cn" -new -key server.key -out server.csr
# 3.生成自簽名證書
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
私有 CA 簽名:
# 1.創建 CA 私鑰
$ openssl genrsa -out ca.key 2048
# 2.生成 CA 的自簽名證書
$ openssl req -subj "/C=CN/ST=Tianjin/L=Tianjin/O=Mocha/OU=Mocha Software/CN=Server CA/emailAddress=test@mochasoft.com.cn" -new -x509 -days 3650 -key ca.key -out ca.crt
# 3.生成需要頒發證書的私鑰
$ openssl genrsa -out server.key 2048
# 4.生成要頒發證書的證書簽名請求,證書簽名請求當中的 Common Name 必須區別於 CA 的證書里面的 Common Name
$ openssl req -subj "/C=CN/ST=Tianjin/L=Tianjin/O=Mocha/OU=Mocha Software/CN=test2.sslpoc.com/emailAddress=test@mochasoft.com.cn" -new -key server.key -out server.csr
# 5.用 2 創建的 CA 證書給 4 生成的 簽名請求 進行簽名
$ openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
注:
- 指定證書數據內容
-subj /C=CN/ST=Guangdong/L=Shenzhen/O=PAX/OU=Common Software/CN=Server CA/emailAddress=qiaojx@paxsz.com
- 去掉 key 加密的輸入提示:去掉
-des3
- 不提問:使用
-batch
參數
一、概述
本文非常簡單地展示了 SSL 的實現,以及整個過程中,證書所扮演的角色。
1、什么是證書及證書的作用
普通的 Web 傳輸,通過 Internet 發送未加密的數據。這樣的話,任何人使用恰當的工具都可以窺視通訊數據的內容。很明顯,這會導致出現一些問題,尤其對於有安全和隱私比較敏感的場景,如:信用卡數據、銀行交易信息。SSL(Secure Socket Layer)用於加密在 Web Server 與 Web Client(最常見的是 Browser) 之間傳遞的數據流。
SSL 使用非對稱加密算法(Asymmetric Cryptography),通常指 PKI(Public Key Cryptography)。使用 PKI 創建兩個秘鑰,一個公鑰,一個私鑰。使用任何一個 Key 做的加密,必須使用另外一個進行解密。這樣的話,使用服務器私鑰加密的數據,只能通過其對應的公鑰進行解密,以確保數據是來自服務器。
為什么使用 SSL 處理數據需要證書?其實從技術角度來說,證書並不是必需的,數據很安全,而且不容易被第三方解密。但是,證書對於通訊過程,扮演着至關重要的角色。證書通過可信的 CA 簽名,以確保證書的持有者與其對外所宣稱的身份一致。使用未經認證簽名的證書,數據可以被加密,但是與你通訊的一方,可能並不如你想。沒有證書的話,偽裝攻擊(Impersonation Attacks)會變得更為普遍。
2、證書的三個作用
- 加密通信
- 身份驗證(驗證對方確實是對方聲稱的對象)
- 數據完整性(無法被修改,修改了會被知)
3、自簽名證書及自簽名類型
當由於某種原因(如:不想通過 CA 購買證書,或者僅是用於測試等情況),無法正常獲取 CA 簽發的證書。這時可以生成一個自簽名證書。使用這個臨時證書的時候,會在客戶端瀏覽器報一個錯誤,簽名證書授權未知或不可信(signing certificate authority is unknown and not trusted.)。
- 自簽名證書
- 私有CA簽名的證書
自簽名證書的 Issuer
和 Subject
是一樣的
區別:
自簽名的證書無法被吊銷,CA 簽名的證書可以被吊銷。
能不能吊銷證書的區別在於:如果你的私鑰被黑客獲取,如果證書不能被吊銷,則黑客可以偽裝成你與用戶進行通信。
如果你的規划需要創建多個證書,那么使用 私有 CA 的方法比較合適,因為只要給所有的客戶端都安裝了 CA 的證書,那么以該證書簽名過的證書,客戶端都是信任的,也就是安裝一次就夠了。
如果你直接用自簽名證書,你需要給所有的客戶端安裝該證書才會被信任,如果你需要第二個證書,則還的挨個給所有的客戶端安裝證書2
才會被信任。
二、自簽名證書
第一步:生成私鑰
openssl
工具集用於生成 RSA Private Key 和 CSR (Certificate Signing Request),也能用於生成自簽名證書,用於測試目的或內部使用。
第一步創建 RSA Private Key。這個秘鑰:
- 1024 bit RSA key
- 使用 3DES 加密
- 使用 PEM 格式存儲,ASCII,可讀
命令行:
$ openssl genrsa -des3 -out server.key 1024
執行結果:
Generating RSA private key, 1024 bit long modulus
.........................................................++++++
........++++++
e is 65537 (0x10001)
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
第二步:從秘鑰中刪除 Passphrase
我們之前生成的私鑰,是帶有 passphrase 的。這帶來一個副作用,就是需要在使用過程中輸入密碼。這對於一些特定場景來說會帶來一些問題。比如:Apache 的自動啟動過程,或者一些工具,甚至有沒有提供輸入 passphrase 的機會。其實是可以將 3DES 的加密從秘鑰中移除的,這樣,使用的過程中就不再需要輸入 passphrase。這也帶來另一個問題,如果其他人獲取到了未加密的私鑰,對應的證書也需要被吊銷,以避免帶來危害。
使用以下命令行來從秘鑰中移除 pass-phrase:
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
新創建的 server.key
文件中,不再包含 passphrase。
-rw-r--r-- 1 root root 745 Jun 29 12:19 server.csr
-rw-r--r-- 1 root root 891 Jun 29 13:22 server.key
-rw-r--r-- 1 root root 963 Jun 29 13:22 server.key.org
第三步:生成 CSR (Certificate Signing Request)
一旦私鑰生成,CSR (Certificate Signing Request) 就可以被生成了。CSR 可以用於以下兩種用途中的任何一種:
- 理想地,將 CSR 發送到 CA,例如: Thawte、Verisign,會做身份驗證,並頒發簽名證書
- 對 CSR 進行自簽名
本文的下一部分演示就是演示 CSR 進行自簽名的方式。
生成 CSR 的過程中,會提示輸入一些信息,這些是證書的 X.509
屬性。其中一個提示是 Common Name (e.g., YOUR name)
,這個非常重要,這一項會填入 FQDN:(Fully Qualified Domain Name)完全合格域名/全稱域名,這個 FQDN 會被 SSL 保護。如果要被保護的網站是 https://public.akadia.com,那么輸入 public.akadia.com
。
用於生成 CSR 的命令行如下:
$ openssl req -new -key server.key -out server.csr
執行過程界面如下:
Country Name (2 letter code) [GB]:CH
State or Province Name (full name) [Berkshire]:Bern
Locality Name (eg, city) [Newbury]:Oberdiessbach
Organization Name (eg, company) [My Company Ltd]:Akadia AG
Organizational Unit Name (eg, section) []:Information Technology
Common Name (eg, your name or your server's hostname) []:public.akadia.com
Email Address []:martin dot zahn at akadia dot ch
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
第四步:生成自簽名證書
當由於某種原因(如:不想通過 CA 購買證書,或者僅是用於測試等情況),無法正常獲取 CA 簽發的證書。這時可以生成一個自簽名證書。使用這個臨時證書的時候,會在客戶端瀏覽器報一個錯誤,簽名證書授權未知或不可信(signing certificate authority is unknown and not trusted.)。
生成一個可以使用 365 天的臨時證書,使用如下命令行:
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
執行結果:
Signature ok
subject=/C=CH/ST=Bern/L=Oberdiessbach/O=Akadia AG/OU=Information
Technology/CN=public.akadia.com/Email=martin dot zahn at akadia dot ch
Getting Private key
三、創建私有 CA ,然后用該 CA 給證書進行簽名
第一步:創建 CA 私鑰
$ openssl genrsa -des3 -out ca.key 4096
第二步:生成 CA 的自簽名證書
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
其實 CA 證書就是一個自簽名證書
第三步:生成需要頒發證書的私鑰
$ openssl genrsa -des3 -out server.key 4096
第四步:生成要頒發證書的證書簽名請求
$ openssl req -new -key server.key -out server.csr
這里注意:證書簽名請求當中的 Common Name
必須區別於 CA 的證書里面的 Common Name
第五步:用第二步
創建的 CA 證書給第四步
生成的簽名請求
進行簽名
$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
四、生成證書鏈多級證書
1、生成根 CA 並自簽(Common Name 填 RootCA)
$ openssl genrsa -des3 -out keys/RootCA.key 2048
$ openssl req -new -x509 -days 3650 -key keys/RootCA.key -out keys/RootCA.crt
2、生成二級 CA(Common Name 填 SecondCA)
$ openssl genrsa -des3 -out keys/secondCA.key 2048
$ openssl rsa -in keys/secondCA.key -out keys/secondCA.key
$ openssl req -new -days 3650 -key keys/secondCA.key -out keys/secondCA.csr
$ openssl ca -extensions v3_ca -in keys/secondCA.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/secondCA.crt -cert keys/RootCA.crt -keyfile keys/RootCA.key
3、生成三級 CA(Common Name 填 ThirdCA)
$ openssl genrsa -des3 -out keys/thirdCA.key 2048
$ openssl rsa -in keys/thirdCA.key -out keys/thirdCA.key
$ openssl req -new -days 3650 -key keys/thirdCA.key -out keys/thirdCA.csr
$ openssl ca -extensions v3_ca -in keys/thirdCA.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/thirdCA.crt -cert keys/secondCA.crt -keyfile keys/secondCA.key
4、使用三級 CA 簽發服務器證書
$ openssl genrsa -des3 -out keys/server.key 2048
$ openssl rsa -in keys/server.key -out keys/server.key
$ openssl req -new -days 3650 -key keys/server.key -out keys/server.csr
$ openssl ca -in keys/server.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/server.crt -cert keys/thirdCA.crt -keyfile keys/thirdCA.key
注:
- 指定證書數據內容
-subj /C=CN/ST=Guangdong/L=Shenzhen/O=PAX/OU=Common Software/CN=Server CA/emailAddress=qiaojx@paxsz.com
- 去掉 key 加密的輸入提示:去掉
-des3
- 不提問:使用
-batch
參數
五、吊銷證書(作廢證書)
首先
$ echo 00 > /etc/pki/CA/crlnumber
一般由於用戶私鑰泄露等情況才需要吊銷一個未過期的證書。(當然我們用本測試 CA 時其時很少用到該命令,除非專門用於測試吊銷證書的情況)
假設需要被吊銷的證書文件為 cert.pem
,則執行以下命令吊銷證書:
$ openssl ca -revoke cert.pem -config /etc/pki/tls/openssl.cnf
生成證書吊銷列表文件(CRL)
准備公開被吊銷的證書列表時,可以生成證書吊銷列表(CRL),執行命令如下:
$ openssl ca -gencrl -out testca.crl -config /etc/pki/tls/openssl.cnf
還可以添加 -crldays
和 -crlhours
參數來說明下一個吊銷列表將在多少天后(或多少小時候)發布。
可以用以下命令檢查 testca.crl
的內容:
$ openssl crl -in testca.crl -text -noout
作者:舌尖上的大胖
鏈接:https://www.jianshu.com/p/e5f46dcf4664
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。