Nic Lin's Blog

喜歡在地上打滾的 Rails Developer

用 OpenSSL 自簽開發用 HTTPS SSL 憑證

有時開發用或是自己防火牆內要用 HTTPS,就會需要用到自己簽 SSL 的部分

通常我會在機器上的位置例如 /etc/certs/awesome.domain 來做,一組憑證就一個資料夾這樣。

首先,先建立 ssl.conf,這裡注意如果是開發網站用的尤其像是 chrome 會擋掉就算是本機信任的憑證,只要沒有寫 [alt_names] DNS 的都不會理你。

假設我要開發的網站名稱是 awesome.domain.tw 好了,可以照以下的寫法。

[req]
prompt = no
default_md = sha256
default_bits = 2048
distinguished_name = dn
x509_extensions = v3_req

[dn]
C = TW
ST = Taiwan
L = Taipei
O = Duotify Inc.
OU = IT Department
emailAddress = admin@example.com
CN = awesome.domain.tw

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = awesome.domain.tw
DNS.2 = *.domain.tw

透過 OpenSSL 執行指令簽名,3650 是一次簽十年

openssl req -x509 -new -nodes -sha256 -utf8 -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -config ssl.conf

接下來我們會看到生成了兩支檔案,分別為公鑰和私鑰。

nginx 設定 https 可以如下

server {
  listen 80 awesome.domain.tw;

  # 將所有HTTP requests轉至HTTPS
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl awesome.domain.tw;
  server_name awesome.domain.tw;

  ssl_certificate /etc/certs/awesome.domain/server.crt;
  ssl_certificate_key /etc/certs/awesome.domain/server.key;

  # 其他ssl參數設定
  ...
}

重啟 nginx 之前,可以用指令 nginx -t 去測試目前的檔案有沒有噴錯或無法讀取的狀況,如果遇到憑證無法讀取,請把 /etc/certs/awesome.domain 下的兩支檔案設定 chmod 744 應該就可以通過了。

接下來可以把公鑰匯出,放到自己電腦的 key chain,設定為永久信任,以下是步驟

MAC -> 搜尋框輸入「key chain」-> 左邊鑰匙圈選「系統」-> 把剛剛的 server.crt 丟進去並雙擊打開,將信任展開後設定為永久信任

或是指令版

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain server.crt

之後將 host 放到自己電腦中的 /etc/hosts 下,例如

10.10.10.1 awesome.domain.tw

打開瀏覽器進行訪問 https://awesome.domain.tw 應該就可以看到已經設置好的安全憑證。

comments powered by Disqus