Apache 2 hỗ trợ SSL/TLS: Hướng dẫn từng bước (tiếp theo Phần II)

Xem lại Phần I
Xem lại đầu Phần II

Phương thức 3: Chứng chỉ kí bởi một CA nội bộ

Phương thức thứ ba của chứng chỉ được kí này có thể được dùng trong mạng Intranets cũng giống như tất cả các tổ chức khác dùng, hay có kế hoạch dùng bộ thẩm định chứng chỉ của riêng họ. Trong trường hợp này, chứng chỉ CA nội bộ phải được cài đặt trên tất cả các web browser kết nối tới an ninh của web server.

Để dùng phương thức này, chúng ta cần tạo khoá public/private của CA nội bộ cũng giống như chứng chỉ của CA và nơi lưu trữ cho các khoá mới.

Chú ý: CA nội bộ nên được tạo ra trên máy chủ phân tán, không kết nối chút nào đến mạng. Hệ điều hành chỉ cho phép truy cập đối với những ngưòi đã qua kiểm định và tự bản thân bộ máy đặt trong mức an toàn vật lí. Khoá private của CA là phần tử đáng kể nhất của toàn bộ hệ thống PKI. Nếu khoá này được thông qua thì tất cả chứng chỉ khác được kí bởi CA cũng xem như được thông qua.

Chúng ta sẽ dùng thư viện OpenSSL để cài đặt môi trường từng bước một như danh sách dưới đây. Tất nhiên, nếu chúng ta đã có một CA nội bộ, chúng ta có thể bỏ qua phần này và chuyển sang việc tạo các yêu cầu chứng chỉ cho web server.

1. Chuẩn bị cấu trúc thư mục cho CA mới (biến số môi trường $SSLDIR nên thêm vào bản khởi động tương xứng, chẳng hạn như /etc/profile or /etc/rc.local):

export SSLDIR=$HOME/ca
mkdir $SSLDIR
mkdir $SSLDIR/certs
mkdir $SSLDIR/crl
mkdir $SSLDIR/newcerts
mkdir $SSLDIR/private
mkdir $SSLDIR/requests
touch $SSLDIR/index.txt
echo "01" > $SSLDIR/serial
chmod 700 $SSLDIR

2. Tạo file cấu hình OpenSSL chính $SSLDIR/openssl.cnf với nội dung sau (tối ưu cho cách dùng với web server SSL):

# =================================================
# OpenSSL configuration file
# =================================================

RANDFILE = $ENV::SSLDIR/.rnd

[ ca ]
default_ca = CA_default

[ CA_default ]
dir = $ENV::SSLDIR
certs = $dir/certs
new_certs_dir = $dir/newcerts
crl_dir = $dir/crl
database = $dir/index.txt
private_key = $dir/private/ca.key
certificate = $dir/ca.crt
serial = $dir/serial
crl = $dir/crl.pem
RANDFILE = $dir/private/.rand
default_days = 365
default_crl_days = 30
default_md = sha1
preserve = no
policy = policy_anything
name_opt = ca_default
cert_opt = ca_default

[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ req ]
default_bits = 1024
default_md = sha1
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
string_mask = nombstr

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_min = 2country
Name_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, YOUR name)
commonName_max = 64
emailAddress = Email Addressemail
Address_max = 64

[ usr_cert ]
basicConstraints = CA:FALSE
# nsCaRevocationUrl =
https://url-to-exposed-clr-list/crl.pem

[ ssl_server ]
basicConstraints = CA:FALSE
nsCertType = server
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, nsSGC, msSGC
nsComment = "OpenSSL Certificate for SSL Web Server"

[ ssl_client ]
basicConstraints = CA:FALSE
nsCertType = client
keyUsage = digitalSignature, keyEnciphermen
textendedKeyUsage = clientAuth
nsComment = "OpenSSL Certificate for SSL Client"

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
basicConstraints = critical, CA:true, pathlen:0
nsCertType = sslCA
keyUsage = cRLSign, keyCertSign
extendedKeyUsage = serverAuth, clientAuth
nsComment = "OpenSSL CA Certificate"

[ crl_ext ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
nsComment = "OpenSSL generated CRL"

3. Bây giờ tạo ra cặp khoá public/private của CA và chứng chỉ CA tự kí:

openssl req \
-config $SSLDIR/openssl.cnf \
-new \ -x509 \ -days 3652 \
-sha1 \
-newkey rsa:1024 \
-keyout $SSLDIR/private/ca.key \
-out $SSLDIR/ca.crt \
-subj '/O=Seccure/OU=Seccure Root CA'

4. Cần nhấn mạnh rằng khoá private của CA (ca.key) có thể được bảo vệ bằng một cụm mật khẩu khó tưởng tượng ra và nên có thời gian hợp lệ lâu hơn so với các chứng chỉ thông thường (chẳng hạn như 10 -30 năm hoặc hơn).

Chứng chỉ của CA “ca.crt’ nên được công bố trên trang web của Intranet và cài đặt trên mọi web browser có thể cần dùng nó. Một ví dụ về chứng chỉ CA gốc cài đặt trên Internet Explorer được thể hiện trên hình minh hoạ 2:


Hình 2.
Ví dụ cài đặt chứng chỉ CA gốc trên Internet Explorer
.

Từ điểm này, giờ chúng ta có thể dùng CA nội bộ để kí hoặc thu hồi chứng chỉ. Để tạo ra chứng chỉ web server , chúng ta nên theo các bước sau:

1. Tạo cặp khoá private/public của web server (server.key), và yêu cầu chứng chỉ (request.pem). Phần giới thiệu nay cần được thực thi trên web server.

openssl req \
-new \
-sha1 \
-newkey rsa:1024 \
-nodes \
-keyout server.key \
-out request.pem \
-subj '/O=Seccure/OU=Seccure Labs/CN=www.seccure.lab'

2. Copy yêu cầu chứng chỉ ở trên (request.pem) vào thư mục $SSLDIR/requests trên máy trạm của CA (dùng các phương tiện di động, chẳng hạn như ổ USB)

3. Kí các yêu cầu chứng chỉ như sau (chỉ để thực thi trên máy trạm CA):

openssl ca \
-config $SSLDIR/openssl.cnf \
-policy policy_anything \
-extensions ssl_server \
-out $SSLDIR/requests/signed.pem \
-infiles $SSLDIR/requests/request.pem

4. Kết quả của câu lệnh trên là một chứng chỉ kí (signed.pem) được đặt vào thư mục $SSLDIR/newcerts, và trong file $SSLDIR/signed.pem. Nó bao gồm cả một bản thể hiện kiểu TXT và PEM của chứng chỉ. Bởi vì Apache muốn có kiểu định dạng thuần PEM, nên chúng ta cần chuyền đổi nó như sau:

openssl x509 \
-in $SSLDIR/requests/signed.pem \
-out $SSLDIR/requests/server.crt

5. Copy chứng chỉ mã hoá dạng PEM đã kí (server.crt) trở lại máy web server machine.

Bây giờ chứng chỉ của web server đã sẵn sàng để dùng.

Với bộ thẩm định chứng chỉ nội bộ, nếu chứng chỉ của web server đạt được thì CA có trách nhiệm thu hồi chứng chỉ. Sau đó thông báo cho người dùng và các chương trình ứng dụng biết chứng chỉ này không được dùng nữa.

Để thu hồi, chúng ta cần tìm dãy số của chứng chỉ mà chúng ta muốn trong file $SSLDIR/index.txt . Sau đó có thể thu hồi như sau:

openssl ca \
-config $SSLDIR/openssl.cnf \
-revoke $SSLDIR/newcerts/.pem

Để tạo ra một file CRL (Certificate Revocation List), chúng ta có thể dùng các câu lệnh sau:

openssl ca -config $SSLDIR/openssl.cnf -gencrl -crlexts crl_ext -md sha1 -out $SSLDIR/crl.pem

File trên nên được công bố trên website của CA và phân phối cho người dùng. Khi phân phối CRLs chúng ta cũng nên dùng giao thức Online Certificate Status Protocol (OCSP). Để biết thêm thông tin về OCSP, bạn có thể tìm trong RFC 2560 .

Chú ý rằng một số đường dẫn (bao gồm cả Firefox) chỉ chấp nhận CRLs mã hoá dạng DER, Vì thế trước khi cài đặt file crl.pem chúng ta phải chuyển đổi như sau:

openssl crl \
-in $SSLDIR/crl.pem \
-out $SSLDIR/revoke_certs.crl \
-outform DER

Cũng chú ý rằng để web browser kiểm tra chứng chỉ của web server có bị thu hồi hay không, tuỳ chọn “Check for server certificate revocation” nên được đánh dấu trong phần Settings của MS Internet Explorer. Nó được chỉ ra trong hình 3 và 4 như sau:


Hình 3.
Cấu hình Internet Explorer để kiểm tra việc thu hồi chứng chỉ.


Hình 4.
Trả lời của Internet Explorer's với một chứng chỉ bị thu hồi.

Cài đặt chứng chỉ

Tại thời điểm này chúng ta có thể tiến tới cài đặt khoá private của web server (server.key) và chứng chỉ (server.crt) vào môi trường Apache:

install -m 600 -o root -g sys server.key /usr/local/apache2/conf/ssl.key/
install -m 644 -o root -g sys server.crt /usr/local/apache2/conf/ssl.crt/

Chúng ta cũng nên chắc rằng các hưỡng dẫn trong file cấu hình của Apache đang trỏ tới file trên (trong httpd.conf).

SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key

Bước cuối cùng là khởi động lại Apache để các thay đổi có hiệu quả:

/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl startssl

Bây giờ chúng ta có thể kiểm tra xem liệu website SSL có được chấp nhân từ các web browser hay không. Và liệu các web browser có thể thẩm định web server thành công hay không. Lần này sẽ không có các cảnh báo như trong hình 5:


Hình 5.
Kết nối an toàn với một chứng chỉ phù hợp.

Tổng kết phần II

Phần này đã hướng dẫn các bạn làm thế nào để cấu hình mod_ssl, tạo và dùng chứng chỉ X.509v3 của web server. Tiếp theo, trong phần III và cũng là phần cuối của loạt bài này chúng ta sẽ thảo luận việc thẩm định client thông qua các chứng chỉ cũng như các lỗi thông thường và các kiểu tấn công phổ biến có thể đe doạ đến an ninh của truyền thông SSL.

Mời bạn đón đọc Phần III

Thứ Hai, 14/08/2006 10:14
31 👨 879
0 Bình luận
Sắp xếp theo