0

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí