2017年6月7日 星期三

Nginx 設定 https 連線

假設要自己發憑證給網站。

先建立放SSL憑證的資料夾
$ mkdir /etc/nginx/ssl
產生網站的私鑰、證書。
example.com.key:私鑰(private key)
example.com.crt:證書(certificate)
(其中 -nodes 參數,表示不對 private key 加密,避免每次啟動 nginx 需要輸入密碼。)
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/example.com.key -out /etc/nginx/ssl/example.com.crt
(再來填寫一些基本的資料,即可產生example.com.key、example.com.crt 兩個檔)
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:


在 nginx 網站設定檔加入監聽 443 SSL 設定、與指定憑證位置(原本 listen 80 可保留共存)
#SSL
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
重新讀取設定
$ systemctl reload nginx
若有設定防火牆,設定防火牆允許 https(443 port) 通行,
$ firewall-cmd --permanent --zone=public --add-service=https
$ firewall-cmd --reload
$ firewall-cmd --list-all --zone=public


其他:
  • 若「listen 443 ssl;」只寫「listen 443;」,缺了「 ssl」
    Chromw 會出現錯誤訊息:「net::ERR_SSL_PROTOCOL_ERROR」
    Firefox 會出現錯誤訊息:「SSL 收到含超出最大允許字串長度的記錄。 錯誤代碼: SSL_ERROR_RX_RECORD_TOO_LONG」
    參考:http://serverfault.com/q/605215
  • 沒加 -nodes 參數,不對 private key 加密,產生的檔案內容格式:
    example.com.key(私鑰)
    -----BEGIN PRIVATE KEY-----
    MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeicw2jouYIdb3
    +re2QwHGWfrAs7+6gdvPzbsZAX+1MaB5CulMOlqTW5R/xJCTyBRegdpc9Oq8Ufsz
    Nkp5EyABT/1kdACh8HBUd4emaRDdng8nkxi4m9bFuPvDV3eV9b1c44a/PoDrk5Ks
    .....
    GToHKxAElC0nvdYRlTgmm4Gh2AbzaB7uhEkDd8ifuCAt4SssMu0MWvxXgUHNaJKc
    EVg8zxwJUnHotFVsQajaiVYnMDaMYoMe3PeUjIs5EK5ueEJnlB/jBYYlH6haVN2m
    CrOa1VRvAkRmWKUAzMObreEm
    -----END PRIVATE KEY-----
    
    example.com.crt(證書)
    -----BEGIN CERTIFICATE-----
    MIIDkzCCAnugAwIBAgIJAJZQ6uDkx3pPMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
    BAYTAmFhMQswCQYDVQQIDAJhYTELMAkGA1UEBwwCYWExCjAIBgNVBAoMAWExCzAJ
    .....
    pKE6/3wZ4SXio4oLKFGziBGqg+5kxzla2fb1PDUNRbmyQEzB+ZFtFgVHcgXU55ff
    bLprWdbDn4bldhEyl9UHWfwlOs0M6g6yfnc7zmJUxrZ5qmMmMhbkZJ4X30LUYZif
    Vgo4FV3Ujg==
    -----END CERTIFICATE-----
    
  • 有加 -nodes 參數,對 private key 加密,產生的檔案內容格式:
    example.com.key(私鑰)
    -----BEGIN ENCRYPTED PRIVATE KEY-----
    MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIwU2mXoH/UvICAggA
    MBQGCCqGSIb3DQMHBAgnLQEy2LhjSQSCBMiq040M9Ryl5ygXVvNorGkttO3wK0Tl
    uRRRZJplhQVBc09zm0N2HyjO93wZPnVycrI2n6m04w0IMSsc6IpbOaflqwcKN7xG
    .....
    37mVxQx45mN7f8im23uJDNs5n29yexc21YzaEaP5BNwBpJrJtNAVR0p63h+LRhGJ
    ByA24Brmys/RE5xpYkqtp4V47aJcIwYgy4LSyWW6ITGYRMq9FlaziUjyFpEaddIc
    ho8=
    -----END ENCRYPTED PRIVATE KEY-----
    
    example.com.crt(證書)
    -----BEGIN CERTIFICATE-----
    MIIDlTCCAn2gAwIBAgIJAIT9a7cvK/EpMA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
    BAYTAmFhMQswCQYDVQQIDAJhYTELMAkGA1UEBwwCYWExCzAJBgNVBAoMAmFhMQsw
    .....
    FT9xCMZp+Z6n6LwWdBWkJ1mASwkxgRDKZzSBaiRN35pT/JSbUqwGH8etD8QMXBBq
    CqiTJM/D3X6YMpKInKnFV7Z/qAQqpcfYYPzBLNAosOmUkUBVYxwtKbUxNoPJDMQi
    kEzWv9Oc5VNC
    -----END CERTIFICATE-----
    
  • 查看 example.com.crt 證書內容
    $ openssl x509 -in example.com.crt -text -noout
    
    參考:DER vs. CRT vs. CER vs. PEM Certificates and How To Convert Them
  • A certificate contains a public key
    參考:What is the difference between a certificate and a key with respect to SSL? - Super User
  • TLS:Transport Layer Security
    SSL:Secure Socket Layer
    .key:私鑰。
    .csr:Certificate Signing Request 證書簽名請求,像憑證機構申請憑證時,給憑證機構的檔案。
    .crt:Certificate,證書。
    X.509:一種證書格式。一般 .crt 附檔名。BASE64編碼(apache、linux):.pem。二進位編碼(windows、Java):.der。
    參考:openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼? - 菩提树下的杨过 - 博客园
  • 一般向憑證機構申請憑證流程:
    「產生 public key(CSR)、private key」-->「public key(CSR)給憑證機構簽署認証」-->「憑證機構回覆簽署後的 Certificate(證書、CRT)」
    參考:SSL憑証(SSL certificate)的原理 - 知識庫 - 無限空間,虛擬主機,網域註冊,網域管理

其他參考:
http://nginx.org/en/docs/http/configuring_https_servers.html
NGINX 設定 HTTPS 網頁加密連線,建立自行簽署的 SSL 憑證 - G. T. Wang
Masterclass: Secure your website with SSL encryption | Linux Voice
openssl入門
寫程式是良心事業: OpenSSL - 金鑰與憑證的管理
OpenSSL 操作筆記 - 檔案格式轉換
不自量力 の Weithenn: SSL Certificate-自行產生 SSL 憑證
7.2. web 伺服器 ssl 證書
Chapter 7. OpenSSL
What is SSL and what are Certificates?


查 openssl 指令:
$ openssl -h (輸入不存在的指令,例如 -h,會列出可用指令)
$ openssl req -h
$ man openssl
$ man req
$ man x509
OpenSSL - OpenFoundry
常用OPENSSL指令介紹 - SSL憑證推薦網 | SSL憑證 | code Sign
https://www.openssl.org/docs/manmaster/
https://www.openssl.org/docs/manmaster/man1/req.html
openssl 证书请求和自签名命令req详解 - Gordon0918 - 博客园
OpenSSL之命令详解 - 让梦冬眠 - 51CTO技术博客


沒有留言:

張貼留言