1 SSL/TLS基本概念
SSL: Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。它是在上世紀90年代中期,由Netscape公司設計,目前已有3.0版本。為啥要發明 SSL 這個協議呢?因為原先互聯網上使用的 HTTP 協議是明文的,內容是不加密的,這樣就很可能在內容傳播的時候被別人監聽到,對於安全性要求較高的場合,必須要加密,https就是帶加密的http協議。SSL協議的發明,就解決這些問題。目前SSL有1.0,2.0,3.0。
TLS: Transport Layer Security(傳輸層安全協議)。是 SSL的標准化,相當於SSL的升級,可以把SSL看作是windows7,而TLS看作是windows10。很多時候我們把這兩者並列稱呼 SSL/TLS,因為這兩者可以視作同一個東西的不同階段。HTTPS 協議,說白了就是“HTTP 協議”和“SSL/TLS 協議”的組合。可以把 HTTPS 大致理解為—“HTTP over SSL”或“HTTP over TLS”。目前TLS有1.0,1.1,1.2,其中1.0基於SSL 3.0,修改不大。
SSL證書: SSL安全協議主要用來提供對用戶和服務器的認證;對傳送的數據進行加密和隱藏;確保數據在傳送中不被改變,即數據的完整性。SSL證書通過在客戶端瀏覽器和Web服務器之間建立一條SSL安全通道,由於SSL技術已建立到所有主要的瀏覽器和WEB服務器程序中,因此,僅需安裝服務器證書就可以激活該功能了。通過它可以激活SSL協議,實現數據信息在客戶端和服務器之間的加密傳輸,可以防止數據信息的泄露。保證了雙方傳遞信息的安全性,而且用戶可以通過服務器證書驗證他所訪問的網站是否是真實可靠。
2 證書相關
2.1 證書申請文件
私鑰: 私鑰是一個算法名稱加上密碼串,用來加解密用的文件或者字符串。
公鑰: 公鑰也是一個算法名稱加上密碼串,一般不會單獨給別人,而是嵌在證書里面一起給別人。
密鑰: 用來加解密用的文件或者字符串。密鑰在非對稱加密的領域里,指的是私鑰和公鑰,他們總是成對出現,其主要作用是加密和解密。常用的加密強度是2048bit。
CA: certificate authority,認證證書的第三方機構,專門用自己的私鑰給別人進行簽名的單位或者機構
申請(簽名)文件: 在公鑰的基礎上加上一些申請人的屬性信息,比如域名、名稱、國家、地區以及證書適用於什么場景等信息,然后帶上進行的簽名,發給CA(私下安全的方式發送),帶上自己簽名的目的是為了防止別人篡改文件。
證書文件: 證書由公鑰加上描述信息,然后經過私鑰簽名之后得到。一般都是一個人的私鑰給另一個人的公鑰簽名,如果是自己的私鑰給自己的公鑰簽名,就叫自簽名。
簽名過程: CA收到申請文件后,會走核實流程,確保申請人確實是證書中描述的申請人,防止別人冒充申請者申請證書,核實通過后,會用CA的私鑰對申請文件進行簽名,簽名后的證書包含申請者的基本信息,CA的基本信息,證書的使用年限,申請人的公鑰,簽名用到的摘要算法,CA的簽名。
2.2 證書文件格式
證書的編碼格式
PEM:是Privacy Enhanced Mail的簡稱,通常用於數字證書認證機構(Certificate Authorities,CA),擴展名為.pem, .crt,,.cer, .key。內容為Base64編碼的ASCII碼文件,有類似“-----BEGIN CERTIFICATE-----“和 “-----END CERTIFICATE-----“的頭尾標記。服務器認證證書,中級認證證書和私鑰都可以儲存為PEM格式(認證證書其實就是公鑰)。Apache和nginx等類似的服務器使用PEM格式證書。
DER:是Distinguished Encoding Rules的簡稱,與PEM不同之處在於其使用二進制而不是Base64編碼的ASCII。擴展名為.der,但也經常使用.cer用作擴展名,所有類型的認證證書和私鑰都可以存儲為DER格式。Java和Windows服務器使用DER格式證書。
證書簽名請求CSR
CSR:是Certificate Signing Request的簡稱,它是向CA機構申請數字證書時使用的請求文件。在生成請求文件前,我們需要准備一對對稱密鑰。私鑰信息自己保存,請求中會附上公鑰信息以及國家,城市,域名,Email等信息,CSR中還會附上簽名信息。當我們准備好CSR文件后就可以提交給CA機構,等待他們給我們簽名,簽好名后我們會收到crt文件,即證書。
CSR並不是證書,而是向權威證書頒發機構獲得簽名證書的申請。把CSR交給權威證書頒發機構,權威證書頒發機構對此進行簽名。保留好CSR,當權威證書頒發機構頒發的證書過期的時候,還可以用同樣的CSR來申請新的證書,key保持不變。
證書文件擴展名
CRT:表示證書,常見於linux系統,可能是PEM編碼和DER編碼,大多數是PEM編碼。
CER:表示證書,常見於Windows系統,可能是PEM編碼和DER編碼,大多數是DER編碼。
KEY:存放一個公鑰或者私鑰,編碼可能是PEM或者DER。查看KEY的辦法:openssl rsa -in test.key -text -noout
CSR:Certificate Signing Request,證書簽名請求,核心內容是一個公鑰,在生成這個申請的時候,同時也會生成一個私鑰。
PFX/P12:predecessor of PKCS#12,常用語windows IIS。
JKS:即Java Key Storage,這是Java的專利。
證書轉換
PEM轉為DER:openssl x509 -in cert.crt -outform der -out cert.der
DER轉為PEM:openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
查看DER格式證書的信息:openssl x509 -in certificate.der -inform der -text -noout
3 openssl
3.1 介紹
openssl 是目前最流行的 SSL 密碼庫工具,采用C語言開發,其提供了一個通用、健壯、功能完備的工具套件,用以支持SSL/TLS 協議的實現。openssl提供的功能相當強大和全面,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協議,並提供了豐富的應用程序供測試或其它目的使用。openssl支持Linux、Windows、BSD、Mac等平台具有廣泛的適用性。
3.2 加密以及證書管理
3.2.1 對稱加密
加密
[root@devops openssl]# vim aaa linux [root@devops openssl]# openssl enc -aes-256-ecb -a -in aaa -out bbb -k 1234 [root@devops openssl]# ls aaa bbb [root@devops openssl]# cat bbb U2FsdGVkX1/a6xPMGCtW1caekUrFFoe1sGgomoVRWYU=
-a:表示使用base64
-k:表示加密密碼
解密
[root@devops openssl]# openssl enc -aes-256-ecb -d -a -in bbb -out ccc -k 1234 [root@devops openssl]# cat ccc linux
-d:表示解密,解密后的文件ccc與aaa內容一致
3.2.2 非對稱加密
生成密鑰
[root@devops openssl]# openssl genrsa -out rainbowhhy_private.key 2048 [root@devops openssl]# ls rainbowhhy_private.key
提取公鑰
[root@devops openssl]# openssl rsa -in rainbowhhy_private.key -pubout > rainbowhhy_public.key writing RSA key [root@devops openssl]# ls rainbowhhy_private.key rainbowhhy_public.key
生成密鑰(加密)
[root@devops openssl]# openssl genrsa -aes256 -passout pass:1234 -out rainbowhhy2_private.key 2048
提取公鑰(加密)
[root@devops openssl]# openssl rsa -in rainbowhhy2_private.key -passin pass:1234 -pubout -out rainbowhhy2_public.key
3.2.3 證書管理
3.2.3.1 生成CA證書
生成私鑰
[root@devops openssl]# openssl genrsa -out ca.key 2048
生成自簽證書
[root@devops openssl]# openssl req -new -nodes -x509 -key ca.key -days 365 -out ca.crt -subj "/C=CN/ST=Hubei/L=Wuhan/O=k8s/OU=systemGroup/CN=kubernetesEA:admin@com"
req:證書請求子命令
-new:生成證書請求命令
-x509:直接輸出證書
-key:指定私鑰文件
-nodes:私鑰不加密
-subj:證書擁有着信息
C:Country ,單位所在國家,為兩位數的國家縮寫,如: CN 就是中國
ST:State/Province ,單位所在州或省
L:Locality ,單位所在城市 / 或縣區
O:Organization ,網站的單位名稱
OU:Organization Unit,部門名稱,也常常用於顯示其他證書相關信息,如證書類型,證書產品名稱或身份驗證類型或驗證內容等
CN:Common Name ,網站的域名;
EA:Email Address ,郵箱地址
同時生成私鑰和自簽證書
[root@devops openssl]# openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3650 -out ca.crt -subj "/C=CN/ST=Hubei/L=Wuhan/O=k8s/OU=systemGroup/CN=kubernetes" [root@devops openssl]# ls ca.crt ca.key
3.2.3.2 生成CSR和CA簽名
生成私鑰
[root@devops openssl]# openssl genrsa -out ca.key 2048
生成csr
[root@devops openssl]# openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=Hubei/L=Wuhan/O=k8s/OU=systemGroup/CN=kubernetes" [root@devops openssl]# ls ca.csr ca.key [root@devops openssl]# openssl req -text -noout -in ca.csr
生成證書
使用 CA 證書及CA密鑰 對請求簽發證書進行簽發,生成 x509證書
[root@devops openssl]# openssl x509 -req -days 3650 -in ca.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out ca.pem [root@devops openssl]# ls ca.crt ca.csr ca.key ca.pem ca.srl
4 cfssl
4.1 介紹
cfssl是 CloudFlare 公司開源的一款PKI/TLS工具,提供了命令行工具和一個 HTTP API 服務器用於簽名,驗證並且捆綁TLS證書的 HTTP API 服務。 使用Go語言編寫。
4.2 cfssl安裝
下載工具包
[root@devops cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [root@devops cfssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [root@devops cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 [root@devops cfssl]# chmod +x cfssl* [root@devops cfssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl_linux [root@devops cfssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson [root@devops cfssl]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
命令
生成證書需要使用子命令gencert
gencert:生成新的key和簽名證書
可選參數:
-ca:指明ca的證書
-ca-key:指明私鑰文件
-config:指明請求證書的json文件
-profile:與-config中的profile對應,是指根據config中的profile段來生成證書的相關信息
4.3 管理證書
4.3.1 配置CA認證
配置證書請求文件
[root@devops cfssl]# cfssl print-defaults csr > ca-csr.json [root@devops cfssl]# vim ca-csr.json { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Hubei", "L": "Wuhan", "O": "k8s", "OU": "systemGroup" } ], "ca": { "expiry": "87600h" } } [root@devops cfssl]# ls ca-csr.json
CN: Common Name,瀏覽器使用該字段驗證網站是否合法,一般寫的是域名,瀏覽器使用該字段驗證網站是否合法
C:Country, 國家
ST:State,州,省
L: Locality,地區,城市
O:Organization Name,組織名稱,公司名稱
OU:Organization Unit Name,組織單位名稱,公司部門
生成CA證書
[root@devops cfssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca [root@devops cfssl]# ls ca.csr ca-csr.json ca-key.pem ca.pem 生成了ca.csr, ca-key.pem, ca.pem 三個文件
4.3.1 配置服務證書
配置服務證書生成策略
[root@devops cfssl]# cfssl print-defaults config > ca-config.json [root@devops cfssl]# vim ca-config.json { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "87600h" } } } }
默認策略,指定了證書的有效期是一年(8760h)
profile可以設置多個,這里指定kubernetes策略,指定了證書的用途
signing, 表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE
server auth:表示 client 可以用該 CA 對 server 提供的證書進行驗證
client auth:表示 server 可以用該 CA 對 client 提供的證書進行驗證
配置請求服務器csr文件
[root@devops cfssl]# vim server-csr.json { "CN": "kubernetes", "hosts": [ "127.0.0.1", "192.168.10.11", "192.168.10.12", "192.168.10.13" ], "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "ST": "Hubei", "L": "Wuhan", "O": "k8s", "OU": "systemGroup" }] } [root@devops cfssl]# ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server-csr.json
生成證書
[root@devops cfssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server [root@devops cfssl]# ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server.csr server-csr.json server-key.pem server.pem
查看證書
[root@devops cfssl]# cfssl certinfo -cert server.pem [root@devops cfssl]# cfssl certinfo -csr server.csr [root@devops cfssl]# cfssl-certinfo -cert server.pem [root@devops cfssl]# openssl x509 -noout -text -in server.pem