请稍侯

使用自建证书配置HTTPS服务器

24 December 2016

使用自建证书配置HTTPS服务器

安装升级openssl

  • 首先,查看下当前设备的openssl版本,如果版本在openssl1.0.1g以上,请略过。查看命令:openssl version -a

  • 下载:wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz

  • 下载完之后,解压并进行安装:

tar -zxvf openssl-1.0.2j.tar.gz
cd  openssl-1.0.1g         
./config shared zlib            
make && make install
  • 安装后再进行相应的设置:
#修改历史的OpenSSL文件设置备份
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old
#设置软连接使其使用新的OpenSSL版本 刚刚安装的OpenSSL默认安装在/usr/local/ssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
#更新动态链接库数据
echo "/usr/local/ss

在Mac El Capitan 加入了Rootless机制,以上命令可能不失败,需要重启按住 Command+R,进入恢复模式,在实用工具菜单栏中打开终端设置:csrutil disable,再重启即可。 设置好后,后面如果要恢复默认,执行:csrutil enable

  • 最后查看一下版本:openssl version

创建CA相关的证书

  • 首先,可以查看openssl配置文件,了解 CA 环境。/etc/ssl/openssl.cnf

  • 创建 demoCA 目录,命令:

cd /etc/ssl  
mkdir demoCA
  • 进入 demoCA 目录 ,在其下创建:private 目录、newcerts 目录、crl 目录及 index.txt、serial 文件。
cd demoCA
mkdir private newcerts crl 
touch index.txt serial
echo 01 > serial        #设定编号初始值
  • 生成根密钥
命令:
cd /etc/ssl/demoCA
openssl genrsa -out private/cakey.pem 2048 
genrsa :生成私钥
-out :输出到那里
rsa :提取公钥  

注: 使用命令:( umask 077; openssl genrsa -out private/cakey.pem 2048 ) 可以使 cakey.pem 私钥文件权限为700
  • 生成根证书
命令:
cd /etc/ssl/demoCA     [可省略]
openssl req -new -x509 -key private/cakey.pem -out cacert.pem 
 
命令解析:    
  req: 生成证书签署请求
  -news : 新请求
  -key  : 指定私钥文件
  -out  : 指定生成证书位置
  -x509 : 生成自签署证书,并指定证书类型
  -days n : 有效天数 

命令效果:(:后为填写内容)
Country Name (2 letter code) [XX]:CN            #国家(大写缩写)
State or Province Name (full name) []:shannxi   #省份或洲
Locality Name (eg, city) [Default City]:xian    #城市
Organization Name (eg, company) [Default Company Ltd]:xiyou   #公司
Organizational Unit Name (eg, section) []:linux  #部门    
Common Name (eg, your name or your server's hostname) []:xxx.xxx.xxx.xxx.#主机

主机必须注意:必须与证书所有者能解析到的名字保持一致(即:你服务器的 IP 地址或域名),否则将无法通过验证

Email Address []:                               #邮箱(可以不填)
附:以上操作默认选项可通过修改配置文件(/etc/pki/tls/openssl.cnf)修改

创建配置apache相关的证书

  • 为服务器生成 ssl 密钥,首先创建 ssl 目录:
命令:
cd /etc/apache2
mkdir ssl
cd ssl
openssl genrsa -out apache.key 2048
  • 为apache服务器生成证书签署请求
命令:openssl req -new -key apache.key -out apache.csr

命令解释如下
注:如果证书的使用者是自己,所填项必须与上面填的一样,负责最后 CA 根据证书请求来签署证书时报错

若是证书的使用者是别人,除了 Commone Name 一定要是你要授予证书的服务器域名或主机名,其它内容随便

请注意:两者在最后 CA 根据证书请求来签署证书时,使用的方法不同

命令效果:(:后为填写内容)     
Country Name (2 letter code) [AU]:CN                    
State or Province Name (full name) [Some-State]:shannxi
Locality Name (eg, city) []:xian
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xiyou
Organizational Unit Name (eg, section) []:linux
Common Name (e.g. server FQDN or YOUR name) []:xxx.xxx.xxx.xxx
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(不填)         #证书请求需要加密存放
An optional company name []:(不填)
  • 根据请求从CA来签署证书
    • 证书的使用者是自己的情况

    把上一步生成的证书请求 csr 文件,发到 CA 服务器上,在CA上执行

      命令:
      cp apache.csr /etc/ssl
      cd /etc/ssl
      openssl ca -in apache.csr -out apache.crt
    
      命令解析:       
      ca : CA 证书相关子命令
      openssl ca 默认使用了-cert cacert.pem -keyfile cakey.pem
        
      命令效果:
      Using configuration from /etc/ssl/openssl.cnf
      Check that the request matches the signature
      Signature ok
      Certificate Details:
              Serial Number: 1 (0x1)
              Validity
                  Not Before: Dec 30 08:49:17 2015 GMT
                  Not After : Dec 27 08:49:17 2025 GMT
              Subject:
                  countryName               = CN
                  stateOrProvinceName       = shannxi
                  organizationName          = xiyou
                  organizationalUnitName    = linux
                  commonName                = xxx.xxx.xxx.xxx
              X509v3 extensions:
                  X509v3 Basic Constraints: 
                      CA:FALSE
                  Netscape Comment: 
                      OpenSSL Generated Certificate
                  X509v3 Subject Key Identifier: 
                      D4:83:D5:B4:54:00:C2:FD:BC:70:52:FD:CF:74:0A:69:56:7E:54:02
                  X509v3 Authority Key Identifier: 
                      keyid:1B:DB:DC:36:5A:82:A5:AF:1A:A9:9C:7B:71:51:54:44:10:31:C3:4B
        
      Certificate is to be certified until Dec 27 08:49:17 2025 GMT (3650 days)
      Sign the certificate? [y/n]:y
        
        
      1 out of 1 certificate requests certified, commit? [y/n]y
      Write out database with 1 new entries
      Data Base Updated
    
    • 证书的使用者是别人的情况

    把上一步生成的证书请求 csr 文件,发到 CA 服务器上,在CA上执行

      命令:
      cp apache.csr /etc/ssl
      cd /etc/ssl
      openssl x509 -req -in apache.csr -CA /etc/ssl/demoCA/cacert.pem -CAkey /etc/ssl/demoCA/private/cakey.pem -CAcreateserial -out apache.crt
        
      命令效果:
      Check that the request matches the signature
      Signature ok
      Getting private key
        
    

    最后将生成的 crt 证书发回 apache 服务器使用

      命令:
      cp  apache.crt /etc/apache2/ssl
      cd  /etc/apache2/ssl
      cat  apache.crt
      cd  /etc/apache2
    

配置 Apache 以使用 SSL

  • 首先启用ssl模块:a2enmod ssl

  • 配置default-ssl.conf

修改 sites-available 子目录中的 default-ssl.conf 文件

命令:
cd  /etc/apache2/sites-available
sudo  vim  default-ssl.conf

修改内容如下:

<IfModule mod_ssl.c>
   <VirtualHost _default_:443>
       DocumentRoot /var/www/html
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       SSLEngine on
       SSLCertificateFile /etc/apache2/ssl/apache.crt                     ***** 需要修改部分
       SSLCertificateKeyFile /etc/apache2/ssl/apache.key             ***** 需要修改部分
       <FilesMatch "\.(cgi|shtml|phtml|php)$">
                       SSLOptions +StdEnvVars
       </FilesMatch>
       <Directory /usr/lib/cgi-bin>
                       SSLOptions +StdEnvVars
       </Directory>
       BrowserMatch "MSIE [2-6]" \
                       nokeepalive ssl-unclean-shutdown \
                       downgrade-1.0 force-response-1.0
       BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
   </VirtualHost>
</IfModule>

启用default-ssl.conf,执行:a2ensite default-ssl.conf

  • VirtualHost的SSL配置(以wodedata.com为例)

修改wodedata.com.conf文件:vi /etc/apache2/sites-available/wodedata.com.conf,添加以下内容:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName wodedata.com
        DocumentRoot /var/www/wodedata.com

        #   SSL Engine Switch:
        #   Enable/Disable SSL for this virtual host.
        SSLEngine on

        #   A self-signed (snakeoil) certificate can be created by installing
        #   the ssl-cert package. See
        #   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
        #   If both key and certificate are stored in the same file, only the
        #   SSLCertificateFile directive is needed.
        SSLCertificateFile      /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile  /etc/apache2/ssl/apache.key
</VirtualHost>

</IfModule>
  • 最后重启Apache服务:service apache2 restart

以上参考:

基于 Ubuntu 系统下,自建 CA 及颁发 SSL 证书

自建证书配置HTTPS服务器

How To Set Up Multiple SSL Certificates on One IP with Apache on Ubuntu 12.04

https:自建证书 && iOS使用自签名证书

How to upgrade OpenSSL (macOS)

Mac OS X 11中的/usr/bin 的“Operation not permitted”

openssl自签名证书生成与单双向验证

基于OpenSSL自建CA和颁发SSL证书

如何在Ubuntu 14.04 上为Apache 2.4 安装SSL支持

基于OpenSSL自建CA和颁发SSL证书

openssl总结及私有CA的搭建

搭建私有CA服务器

Ubuntu Apache2 下配置 SSL 证书及全局 HTTPS 强制跳转