Hướng dẫn tạo TLS Cetificiate Fullchain Self-sign cho 1 domain
Thời gian gần đây mình có setup 1 vài hệ thống internal (không publish ra ngoài). Vấn đề là một vài service khi call bắt buộc phải verify SSL (chẳng hạn các lib sử dụng curl).
Với chứng chỉ SSL tự ký đơn giản chỉ với CARoot + TLS Key thì curl sẽ không verify thành công với lỗi unable to get local issuer certificate
Dưới đây là các bước để setup 1 chứng chỉ SSL fullchain để có thể verify thành công.
Mình sẽ note cho wildcard domain *.nguyenvannhan.com
Tạo thư mục làm việc
Tạo các thư mục cần thiết
mkdir -p ~/ca/{root,intermediate,server}
cd ~/ca
Tạo Root CA
Gen key của CARoot:
openssl genrsa -out root/rootCA.key 4096
Tạo root config (root/openssl.cnf
):
[ req ]
distinguished_name = dn
x509_extensions = v3_ca
prompt = no
[ dn ]
O = NVN
CN = NVN Root CA
[ v3_ca ]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
Gen Root cert:
openssl req -x509 -new -nodes -key root/rootCA.key -sha256 -days 3650 \
-out root/rootCA.crt -config root/openssl.cnf
Tạo Intermediate CA
Gen key:
openssl genrsa -out intermediate/intermediateCA.key 4096
Config Intermediate (intermediate/openssl.cnf
):
[ req ]
distinguished_name = dn
x509_extensions = v3_ca
prompt = no
[ dn ]
O = NVN
CN = NVN Intermediate CA
[ v3_ca ]
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
CSR cho Intermediate:
openssl req -new -key intermediate/intermediateCA.key \
-out intermediate/intermediateCA.csr -config intermediate/openssl.cnf
Ký CSR bằng Root:
openssl x509 -req -in intermediate/intermediateCA.csr \
-CA root/rootCA.crt -CAkey root/rootCA.key -CAcreateserial \
-out intermediate/intermediateCA.crt -days 1825 -sha256 \
-extfile intermediate/openssl.cnf -extensions v3_ca
Tạo TLS cert cho *.nguyenvannhan.com
Gen key:
openssl genrsa -out server/nguyenvannhan.com.key 2048
Config CSR (server/openssl.cnf
):
[ req ]
distinguished_name = dn
req_extensions = v3_req
prompt = no
[ dn ]
CN = *.nguyenvannhan.com
O = NVN
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = critical,digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = *.nguyenvannhan.com
DNS.2 = nguyenvannhan.com
Gen CSR:
openssl req -new -key server/nguyenvannhan.com.key \
-out server/nguyenvannhan.com.csr -config server/openssl.cnf
Ký bằng Intermediate:
openssl x509 -req -in server/nguyenvannhan.com.csr \
-CA intermediate/intermediateCA.crt -CAkey intermediate/intermediateCA.key \
-CAcreateserial -out server/nguyenvannhan.com.crt -days 825 -sha256 \
-extfile server/openssl.cnf -extensions v3_req
5️⃣ Ghép chuỗi chứng chỉ
**Chain file dùng cho server (nginx, apache,...)*:
cat server/nguyenvannhan.com.crt intermediate/intermediateCA.crt > server/nguyenvannhan.com.fullchain.crt
6️⃣ Verify bằng OpenSSL
Check cert:
openssl verify -CAfile <(cat root/rootCA.crt intermediate/intermediateCA.crt) server/nguyenvannhan.com.crt
Giả sử mình có 1 domain đã setup demo.nguyenvannhan0810.com
, Check TLS handshake với domain đó.
openssl s_client -connect demo.nguyenvannhan.com:443 \
-CAfile <(cat root/rootCA.crt intermediate/intermediateCA.crt)
✅ Nếu đúng sẽ không còn unable to get local issuer certificate
hay path length constraint exceeded
.
Setup CA Root để máy có thể tin tưởng self-sign TLS
Dù đã tạo TLS thành công. Nhưng vì là self-signed cert. Nên khi bạn truy cập domain trên browser vẫn sẽ bị cảnh báo critical bảo mật. Để pass qua được cảnh báo này thì cần import CA Root vào máy để thiết bị tin tưởng TLS Cert đã cấp.
Do mình chỉ có máy Ubutn nên setup nó thôi.
Import Root CA vào hệ thống (Ubuntu/Debian):
sudo cp root/rootCA.crt /usr/local/share/ca-certificates/thk-rootCA.crt
sudo update-ca-certificates
Test:
curl https://demo.nguyenvannhan.com--cacert root/rootCA.crt
Hoặc nếu đã trust root vào hệ thống:
curl https://demo.nguyenvannhan.com
Như vậy là thành công. Lưu ý chỉ là dùng cho internal tập tành thôi.
All Rights Reserved