OpenSSL, TLS, SSL, CSR, CRT, X.509, Key
https://www.cnblogs.com/yjmyzz/p/openssl-tutorial.html
TLS (Transport Layer Security)
傳輸層安全性協定
SSL (Secure Socket Layer)
安全通訊協定
傳輸層安全性協定(英語:Transport Layer Security,縮寫:TLS)及其前身安全通訊協定(英語:Secure Sockets Layer,縮寫:SSL)是一種安全協定,目的是為網際網路通訊提供安全及資料完整性保障
TLS與SSL對於不是專業搞安全的開發人員來講,可以認為是差不多的,這二者是並列關係,詳細差異見 http://kb.cnblogs.com/page/197396/
CSR (Certificate Signing Request)
即證書籤名請求,這不是證書,可以簡單理解成公鑰,生成證書時要把這個提交給權威的證書頒發機構. 一種包含憑證簽發時所需的公鑰及相關資訊的檔案,不含私鑰;詳見X.509
CRT (certificate)
即證書
X.509
X.509 是一種證書格式.對X.509證書來說,認證者總是CA或由CA指定的人,一份X.509證書是一些標準欄位的集合,這些欄位包含有關使用者或裝置及其相應公鑰的資訊。
X.509的證書檔案,一般以.crt結尾,根據該檔案的內容編碼格式,可以分為以下二種格式:
PEM – Privacy Enhanced Mail,開啟看文字格式,以"—–BEGIN…"開頭, "—–END…"結尾,內容是BASE64編碼. Apache和*NIX伺服器偏向於使用這種編碼格式.
DER – Distinguished Encoding Rules,開啟看是二進位制格式,不可讀. Java和Windows伺服器偏向於使用這種編碼格式
wiki
X.509是密碼學裡公鑰憑證的格式標準。X.509憑證已應用在包括TLS/SSL在內的眾多網路協定裡,同時它也用在很多非線上應用場景里,比如電子簽章服務。X.509憑證里含有公鑰、身分資訊(比如網路主機名,組織的名稱或個體名稱等)和簽章資訊(可以是憑證簽發機構CA的簽章,也可以是自簽章)。1
X.509還附帶了憑證吊銷列表和用於從最終對憑證進行簽章的憑證簽發機構直到最終可信點為止的憑證合法性驗證演算法。X.509是ITU-T標準化部門基於他們之前的ASN.1定義的一套憑證標準。
OpenSSL
相當於SSL的一個實現,如果把SSL規範看成OO中的介面,那麼OpenSSL則認為是介面的實現。介面規範本身是安全沒問題的,但是具體實現可能會有不完善的地方,比如之前的"心臟出血"漏洞,就是OpenSSL中的一個bug.
OpenSSL 產生證書步驟
Step 1: Generate Certificate Authority + Trust Certificate (ca.key + ca.crt).
生成證書請求檔案CSR
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
這一步執行完以後,會生成ca.key檔案:
Generating RSA private key, 4096 bit long modulus
...............++
........................................................++
e is 65537 (0x10001)
生成CA的證書:
openssl req -passin pass:1111 -new -x509 -days 3650 -key ca.key -out ca.crt
該命令先進入互動模式,讓你填一堆東西:
要注意的是Common Name這裡,要填寫成使用SSL證書(即:https協議)的域名或主機名,
否則瀏覽器會認為不安全。
例如:如果以後打算用https://kimi0230.com/xxx 這裡就填寫kimi0230.com
或者
SERVER_CN=localhost
openssl req -passin pass:1111 -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=${SERVER_CN}"
Step 2: Generate the Server Private Key (server.key).
生成Server私鑰KEY
openssl genrsa -passout pass:1111 -des3 -out server.key 4096
Step 3: Get a certificate signing request from the CA (server.csr).
生成證書請求檔案CSR
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/CN=${SERVER_CN}" -config ssl.cnf
Step 4: Sign the certificate with the CA we created (it's called self signing) - server.crt
前面提過X.509證書的認證者總是CA或由CA指定的人,所以得先生成一個CA的證書(Step 1: Generate Certificate Authority)
利用此CA證書給自己頒發一個證書
產生 server.crt
openssl x509 -req -passin pass:1111 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extensions req_ext -extfile ssl.cnf
erver.crt 就是我們需要的證書。當然,如果要在google等瀏覽器顯示出安全的綠鎖標誌,自己頒發的證書肯定不好使,得花錢向第三方權威證書頒發機構申請(即: Step 4是交給權威機構來做,我們只需要提交 server.key、server.csr)
Step 5: Convert the server certificate to .pem format (server.pem) - usable by gRPC
openssl pkcs8 -topk8 -nocrypt -passin pass:1111 -in server.key -out server.pem
Script
https://github.com/kimi0230/practise-gRPC-go/blob/master/ssl/instructions.sh
#!/bin/bash
# Inspired from: https://github.com/grpc/grpc-java/tree/master/examples#generating-self-signed-certificates-for-use-with-grpc
# Output files
# ca.key: Certificate Authority private key file (this shouldn't be shared in real-life)
# ca.crt: Certificate Authority trust certificate (this should be shared with users in real-life)
# server.key: Server private key, password protected (this shouldn't be shared)
# server.csr: Server certificate signing request (this should be shared with the CA owner)
# server.crt: Server certificate signed by the CA (this would be sent back by the CA owner) - keep on server
# server.pem: Conversion of server.key into a format gRPC likes (this shouldn't be shared)
# Summary
# Private files: ca.key, server.key, server.pem, server.crt
# "Share" files: ca.crt (needed by the client), server.csr (needed by the CA)
# Changes these CN's to match your hosts in your environment if needed.
SERVER_CN=localhost
# Step 1: Generate Certificate Authority + Trust Certificate (ca.crt)
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
openssl req -passin pass:1111 -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=${SERVER_CN}"
# Step 2: Generate the Server Private Key (server.key)
openssl genrsa -passout pass:1111 -des3 -out server.key 4096
# Step 3: Get a certificate signing request from the CA (server.csr)
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/CN=${SERVER_CN}" -config ssl.cnf
# Step 4: Sign the certificate with the CA we created (it's called self signing) - server.crt
openssl x509 -req -passin pass:1111 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extensions req_ext -extfile ssl.cnf
# Step 5: Convert the server certificate to .pem format (server.pem) - usable by gRPC
openssl pkcs8 -topk8 -nocrypt -passin pass:1111 -in server.key -out server.pem
[ req ]
default_bits = 4096
distinguished_name = dn
req_extensions = req_ext
prompt = no
[ dn ]
CN = localhost
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost