Apache是一款时下最主流、被广泛使用的web服务器。本文详细描述如何在Apache httpd服务器上部署并使用SSL(Secure Sockets Layer)证书。

前提条件

  • Apache 2.2.34及以上版本

    注意:通过运行 httpd -v 命令行查看Apache服务器版本号。

     $ httpd -v
     # 输出结果:
     # Server version: Apache/2.4.28 (Unix)
     # Server built:   <date/time>
    
  • SSL加解密软件:Apache服务器自身没有Public Key Infrastructure(PKI)相关库,而是采用第三方API进行,如:OpenSSL 1.1.0f及以上版本。

    注意:通过运行openssl version -a命令行查看系统中OpenSSL版本号。其中,build on参数日期须晚于2017年5月

    $ openssl version -a
    # 输出结果:
    # LibreSSL 2.2.7  //版本号
    # built on: date not available  //build on 参数
    # platform: <platform name> //平台名字
    
  • 确保已经获取数字证书。有关获取数字证书方法,可参阅如何获取数字证书

如何部署

开启SSL功能

获取到上述三个文件后,按照如下步骤加载SSL配置:

  1. 加载SSL模块
    默认情况下,Apache服务器无法进行SSL相关的加解密操作,需要在服务器中运行下列命令行加载SSL模块:

    [root@test conf.d]# yum install mod_ssl
    

    注意:加载前,可运行ls –ll命令行确认Apache服务器的modules目录下是否存在mod_ssl.so文件(即SSL模块):

    [root@test conf.d]# ls -l /etc/httpd/modules/ |grep "mod_ssl.so"
    -rwxr-xr-x. 1 root root 219472 10月 20 04:40 mod_ssl.so
    
  2. 确认SSL加解密库文件
    确认存在mod_ssl.so文件后,运行ldd /<path>/httpd命令行查看是否存在SSL加解密的库文件:

    [root@test conf.d]# ldd /usr/sbin/httpd 
    	linux-vdso.so.1 =>  (0x00007fffac528000)
    	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f86f5e5b000)
    	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f86f5c34000)
    	libaprutil-1.so.0 => /lib64/libaprutil-1.so.0 (0x00007f86f5a0a000)
    	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f86f57d3000)           #####<----加解密库文件
    	libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f86f55a9000)
    	libdb-5.3.so => /lib64/libdb-5.3.so (0x00007f86f51ea000)
    
  3. 加载SSL配置
    在主配置文件中通过includeOptionalconf.d/*.conf配置,来加载SSL相关的配置文件。

    注意:根据版本的不同,名称或路径会各有差异。例如:

    • 配置文件可能叫httpd-ssl.confssl.conf
    • 有些版本在extra目录下,加载的关键词为include

SSL相关配置

SSL配置加载完毕后,按照如下步骤对SSL进行相关配置:

  1. 打开配置文件,例如:ssl.conf
  2. 开启443端口的监听:Listen 443 https
  3. 对要使用证书的Virtualhost进行配置
    <VirtualHost _default_:443>
    DocumentRoot "/myproject"  #网站项目目录
    SSLEngine on
    SSLProtocol all -SSLv2 –SSLv3 #开启所有协议去掉sslv2、sslv3
    SSLHonorCipherOrder On  #启用前项保密
    SSLCipherSuite 
    ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 #加密套件
    SSLCertificateFile  /xx/xx/domain.cer  #证书公钥路径
    SSLCertificateKeyFile /xx/xx/domain.key  #证书私钥路径
    SSLCertificateChainFile /xx/xx/domain_ca.crt  #证书链路径
    </VirtualHost>
    

强制HTTP跳转HTTPS (可选)

通过以下设置,将用户默认的HTTP请求自动跳转为HTTPS请求:

  • 加载重写模块
    LoadModule rewrite_module modules/mod_rewrite.so
    
  • 80端口(http)的Virtualhost中配置重写语句
    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule (.*) https://%{SERVER_NAME}/$1 [R]
    

注意:上述步骤需重启后生效。

更多信息

你已成功完成SSL证书部署。如果要对所部署的网站进行安全监测,参阅MySSL的使用