Apache 2.0 với giao thức SSL/TLS: Hướng dẫn từng bước (tiếp Phần I)

Xem lại đầu phần I

Cấu hình SSL/TLS

Trước khi chạy Apache lần đầu tiên, chúng ta cũng cần cung cấp cấu hình ban đầu và tham gia một số nội dung web mẫu. Ít nhất, chúng ta cần theo các bước sau (như là Root):

1. Tạo một số nội dung web mẫu mà sẽ được đáp ứng qua SSL/TLS:

umask 022
 mkdir /www
 echo " \ 
 Test works." > /www/index.html
 chown -R root:sys /www
 

2. Thay thế file cấu hình Apache mặc định (thông thường được tìm thấy trong /usr/local/apache2/conf/httpd.conf) bằng một cái mới, dùng nội dung sau (tối ưu hoá mức an toàn và sự thực thi):

# =================================================
 # Basic settings
 # =================================================
 User apache
 Group apache
 ServerAdmin webmaster@www.seccure.lab 
 ServerName www.seccure.lab
 UseCanonicalName Off
 ServerSignature Off
 HostnameLookups Off
 ServerTokens Prod
 ServerRoot "/usr/local/apache2"
 DocumentRoot "/www"
 PidFile /usr/local/apache2/logs/httpd.pid
 ScoreBoardFile /usr/local/apache2/logs/httpd.scoreboard
 
         DirectoryIndex index.html
 
 # =================================================
 # HTTP and performance settings
 # =================================================
 Timeout 300
 KeepAlive On
 MaxKeepAliveRequests 100
 KeepAliveTimeout 30
 
         MinSpareServers 5
         MaxSpareServers 10
         StartServers 5 
         MaxClients 150 
         MaxRequestsPerChild 0
 
 # =================================================
 # Access control
 # =================================================
 
         Options None 
         AllowOverride None 
         Order deny,allow 
         Deny from all
 
         Order allow,deny 
         Allow from all
 
 # =================================================
 # MIME encoding
 # =================================================
 
         TypesConfig /usr/local/apache2/conf/mime.types
 
 DefaultType text/plain
 
         AddEncoding x-compress                 .Z 
         AddEncoding x-gzip                     .gz .tgz 
         AddType application/x-compress         .Z 
         AddType application/x-gzip             .gz .tgz 
         AddType application/x-tar              .tgz 
         AddType application/x-x509-ca-cert     .crt 
         AddType application/x-pkcs7-crl        .crl
 
 # =================================================
 # Logs
 # =================================================
 LogLevel warn
 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
 LogFormat "%h %l %u %t \"%r\" %>s %b" common
 LogFormat "%{Referer}i -> %U" referer
 LogFormat "%{User-agent}i" agent
 ErrorLog /usr/local/apache2/logs/error_log
 CustomLog /usr/local/apache2/logs/access_log combined
 CustomLog logs/ssl_request_log \
 "%t %h %{HTTPS}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x \
 %{SSL_CIPHER_USEKEYSIZE}x %{SSL_CLIENT_VERIFY}x \"%r\" %b"
 
 # =================================================
 # SSL/TLS settings
 # =================================================
 Listen 0.0.0.0:443
 
 SSLEngine on
 SSLOptions +StrictRequire
 
         SSLRequireSSL
 
 SSLProtocol -all +TLSv1 +SSLv3
 SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
 
 SSLMutex file:/usr/local/apache2/logs/ssl_mutex
 
 SSLRandomSeed startup file:/dev/urandom 1024
 SSLRandomSeed connect file:/dev/urandom 1024
 
 SSLSessionCache shm:/usr/local/apache2/logs/ssl_cache_shm
 SSLSessionCacheTimeout 600
 
 SSLPassPhraseDialog builtin
 SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
 SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
 SSLVerifyClient none
 SSLProxyEngine off
 
         AddType application/x-x509-ca-cert      .crt 
         AddType application/x-pkcs7-crl         .crl
 
 SetEnvIf User-Agent ".*MSIE.*" \ 
     nokeepalive ssl-unclean-shutdown \ 
     downgrade-1.0 force-response-1.0

3. Chú ý: Các bạn nên thay đổi một số giá trị trong file cấu hình trên. Chẳng hạn như tên của web server, địa chỉ e-mail của người quản trị. v.v...

4. Tham gia cấu trúc lại thư mục khoá private của web server, các chứng chỉ, và danh sách thu hồi chứng chỉ (CRLs).

umask 022
 mkdir /usr/local/apache2/conf/ssl.key
 mkdir /usr/local/apache2/conf/ssl.crt
 mkdir /usr/local/apache2/conf/ssl.crl

5. Tạo một dịch vụ “tự kí nhận (nó sẽ chỉ được dùng cho mục đích kiểm tra – các chứng chỉ thực của bạn nên lấy từ một CA thích hợp như Verisign):

openssl req \ 
 -new \ 
 -x509 \ 
 -days 30 \ 
 -keyout /usr/local/apache2/conf/ssl.key/server.key \ 
 -out /usr/local/apache2/conf/ssl.crt/server.crt \ 
 -subj '/CN=Test-Only Certificate'

Kiểm tra phần cài đặt

Tại thời điểm này, chúng ta có thể bắt đầu Apache hỗ trợ SSL/TLS như sau:

/usr/local/apache2/bin/apachectl startssl
 Apache/2.0.52 mod_ssl/2.0.52 (Pass Phrase Dialog)
 Some of your private key files are encrypted for security reasons.
 In order to read them you have to provide us with the pass phrases.
 
 Server 127.0.0.1:443 (RSA)
 Enter pass phrase:*************
 
 Ok: Pass Phrase Dialog successful.

Sau khi máy chủ bắt đầu, chúng ta có thể cố gắng kết nối tới nó bằng cách trỏ vào web browser với một đường dẫn URL có dạng: https://name.of.the.web.server (trong trường hợp của chúng ta là https://www.seccure.lab)

Trong một vài phút, chúng ta sẽ thấy cảnh báo nói rằng có vấn đề với việc kiểm chứng sự xác nhận web server chúng ta muốn truy cập. Minh hoạ trong hình 3 là một ví dụ từ MS Internet Explorer 6.0.


Hình 3
. Cảnh báo trước của IE 6.0.

Sự xuất hiện của cảnh báo trên đúng một cách hoàn hảo! Chúng ta nên nhận cảnh báo này vì hai lí do sau: 

  •  Web browser không biết Certificate Authority (quyền hạn chứng chỉ), được cung cấp bởi chứng chỉ của web server (và không thể biết, bởi vì chúng ta đang dùng chứng chỉ tự kí – selfsigned certificate). 
  • CN (Common Name) – Tên chung được cho bởi chứng chỉ không nối ghép tên của website - tại thời điểm nó là chứng chỉ chỉ đọc (Text-only Certificate), và nó sẽ là tên miền một cách đầy đủ của web server (ví dụ như: www.seccure.lab)

Sau khi thực thi với Internet Explorer, chúng ta nên xem nội dung web sau, như trong hình minh hoạ 4:


Hình 4. Trang web làm việc mẫu của SSL.

Một điều cần chú ý, có một cái khoá vàng ở cuối của web browser. Điều đó có nghĩa là kết nối SSL đã được thiết lập thành công. Giá trị 128 bit nói lên rằng khoá đối xứng được dùng để mã hoá giao dịch có độ dài 128 bit. Và nó đủ mạnh (ít nhất tại thời điểm này) để bảo vệ giao thông mạng khỏi sự xâm nhập trái phép.

Nếu chúng ta kích đúp vào biểu tượng khoá, chúng ta sẽ thấy các thuộc tính của chứng chỉ website, như được chỉ ra trong hình 5:


Hình 5.
Các chi tiết của chứng chỉ tự kí (sekf-signed certificate)

Gở rối

Nếu vì một lí do nào đó chúng ta không thể truy cập được vào website, có một chức năng chẩn đoán hữu ích là “s_client”, nằm trong thư viện OpenSSL. Nó có thể được dùng để gỡ rối các kết nối SSL/TLS. Ví dụ sau chỉ ra cách dùng chức năng này như thế nào:

/usr/bin/openssl s_client -connect localhost:443 
 CONNECTED(00000003)
 depth=0 /CN=Test-Only Certificate 
 verify error:num=18:self signed certificate 
 verify return:1 
 depth=0 /CN=Test-Only Certificate 
 verify return:1
 --- 
 Certificate chain
     0  s:/CN=Test-Only Certificate 
        i:/CN=Test-Only Certificate 
 ---
 Server certificate 
 -----BEGIN CERTIFICATE----- 
 MIICLzCCAZigAwIBAgIBADANBgkqhkiG9w0BAQQFADAgMR4wHAYDVQQDExVUZXN0 LU9ubHkgQ2VydGlmaWNhdGUwHhcNMDQxMTIyMTg0ODUxWhcNMDQxMjIyMTg0ODUx WjAgMR4wHAYDVQQDExVUZXN0LU9ubHkgQ2VydGlmaWNhdGUwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAMEttnihJ7JpksdToPi5ZVGcssUbHn/G+4G43OiLhP0i KvYuqNxBkSqqM1AanR0BFVEtVCSuq8KS9LLRdQLJ/B1UTMOGz1Pb14WGsVJS+38D LdLEFaCyfkjNKnUgeKMyzsdhZ52pF9febB+d8cLmvXFve28sTIxLCUK7l4rjT3Xl AgMBAAGjeTB3MB0GA1UdDgQWBBQ50isUEV6uFPZ0L4RbRm41+i1CpTBIBgNVHSME QTA/gBQ50isUEV6uFPZ0L4RbRm41+i1CpaEkpCIwIDEeMBwGA1UEAxMVVGVzdC1P bmx5IENlcnRpZmljYXRlggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQAD gYEAThyofbK3hg8AJXbAUD6w6+mz6dwsBmcTWLvYtLQUh86B0zWnVxzSLDmwgdUB NxfJ7yfo0PkqNnjHfvnb5W07GcfGgLx5/U3iUROObYlwKlr6tQzMoysNQ/YtN3pp 52sGsqaOOWpYlAGOaM8j57Nv/eXogQnDRT0txXqoVEbunmM= 
 -----END CERTIFICATE----- 
 subject=/CN=Test-Only Certificate 
 issuer=/CN=Test-Only Certificate 
 --- 
 No client certificate CA names sent
 --- 
 SSL handshake has read 1143 bytes and written 362 bytes 
 --- 
 New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA 
 Server public key is 1024 bit 
 SSL-Session: 
         Protocol : SSLv3 
         Cipher : DHE-RSA-AES256-SHA 
         Session-ID:
 56EA68A5750511917CC42A1B134A8F218C27C9C0241C35C53977A2A8BBB9986A 
         Session-ID-ctx: 
         Master-Key: 303B60D625B020280F5F346AB00F8A61A7C4BEA707DFA0ED8D2F52371F8C4F08
 7FB6EFFC02CE3B48F912D2C8929DB5BE 
         Key-Arg : None 
         Start Time: 1101164382 
         Timeout : 300 (sec) 
         Verify return code: 18 (self signed certificate) 
 --- 
 GET / HTTP/1.0 
 
 HTTP/1.1 200 OK 
 Date: Mon, 22 Nov 2004 22:59:56 GMT 
 Server: Apache 
 Last-Modified: Mon, 22 Nov 2004 17:24:56 GMT 
 ETag: "5c911-46-229c0a00" 
 Accept-Ranges: bytes 
 Content-Length: 70 
 Connection: close 
 Content-Type: text/html Test works. 
 closed

Chức năng s_client có nhiều tuỳ chọn hữu ích. Chẳng hạn như tắt/mở (on/off) một giao thức cụ thể (-ssl2 , -ssl3, -tls1). Sau đó khởi động lại Apache và kiểm tra các file đăng nhập (/usr/local/apache2/logs/) để có thêm thông tin.

Chúng ta cũng có thể dùng Ethereal hoặc ssldump. Chúng ta có thể xem một cách thụ động các thông báo Handshake của SSL, và cố gắng tìm ra lí do lỗi nếu không có những công cụ này.

Một màn hình nhỏ thực thi việc này trên Ethereal được mô tả trong hình 6.


Hình 6.
Màn hình Ethereal với phương thức SSL Handshake.

Kết luận phần I

Việc cài đặt và chạy Apache 2 secure cùng giao thức SSL và một chứng chỉ mẫu đã kết thúc phần một của loạt bài này. Trong phần hai tới các bạn sẽ được giới thiều về các thiết lập an ninh và sự thực thi cho mod_ssl, cũng như tiến trình tạo ra một chứng chỉ web server phù hợp.

Xem tiếp Phần II

Thứ Năm, 17/01/2019 14:58
31 👨 2.160