https迁移实践手记

前言

以前想过全站https,但那个时候证书难搞,所以一直没动力去弄,这两年IOS和小程序相继强制使用https的接口,也预示着https的时代来临,所以花了2天做了写迁移工作,由于服务器用的都是阿里云全家桶,证书服务也不例外,话说阿里也很厚道,有免费的证书提供,还手把手交你弄,当然中间也会遇到坑,记录之,下文绝大部分来自阿里云的相关说明文档,我主要是把nginx和apache的证书实践了,其他供参考。
PS:企业证书感觉还挺贵,非企业证书按二级域名注册算钱( ̄▽ ̄)~*

什么是公钥和私钥?

公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。
数字证书是一个经证书授权中心(CA)数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。
阿里云证书服务对您密钥的加密算法和长度有如下要求:加密算法使用RSA,加密长度至少2048,推荐您使用2048位,SHA256摘要算法。
您可以通过如下方式创建私钥:

使用OpenssL生成私钥。

OpenssL是一个强大且应用广泛的安全基础库工具,您可以在 http://www.openssl.org/source/ 来获取最新的openssl安装包(版本要>=1.0.1g)。
在命令行模式下运行:
openssl genrsa -out myprivate.pem 2048
来生成您的私钥文件: myprivate.pem, 其中"2048"是加密长度

使用Keytool导出私钥。

Keytool是JDK中自带的密钥管理工具,可以制作Keystore(jks)格式的证书文件,您可以在 http://www.oracle.com/technetwork/java/javase/downloads/index.html 中下载JDK来获取keytool工具。
因为keystore制作公钥和私钥默认是不可以导出的,所以需要您从已经创建好的 .keystore 文件中导出私钥。
从 .keystore 中导出私钥需要参考 主流数字证书都有哪些格式?中的转换方法1和4。
在导出的文件中

-----BEGIN RSA PRIVATE KEY-----
……
-----END RSA PRIVATE KEY-----

或者类似于

-----BEGIN PRIVATE KEY-----
……
-----END PRIVATE KEY-----

的即是私钥。
无论哪种方式生成密钥,都请您完善的保护好您的私钥文件,私钥文件如果丢失或者损坏,您申请对应的公钥/数字证书将无法使用。

主流数字证书都有哪些格式?

一般来说,主流的Web服务软件,通常都基于两种基础密码库:OpenSSL和Java。
Tomcat、Weblogic、JBoss等,使用Java提供的密码库。通过Java的Keytool工具,生成Java Keystore(JKS)格式的证书文件。
Apache、Nginx等,使用OpenSSL提供的密码库,生成PEM、KEY、CRT等格式的证书文件。
此外,IBM的产品,如Websphere、IBM Http Server(IHS)等,使用IBM产品自带的iKeyman工具,生成KDB格式的证书文件。微软Windows Server中的Internet Information Services(IIS),使用Windows自带的证书库生成PFX格式的证书文件。
如果您在工作中遇到带有后缀扩展名的证书文件,可以简单用如下方法区分:
*.DER *.CER : 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。
*.CRT : 这样的文件可以是二进制格式,也可以是文本格式,一般均为文本格式,功能与.DER/.CER相同。
*.PEM : 一般是文本格式,可以放证书或私钥,或者两者都包含。 .PEM如果只包含私钥,那一般用 .KEY代替。
*.PFX *.P12 是二进制格式,同时含证书和私钥,一般有密码保护。
怎么判断是文本格式还是二进制?
用记事本打开,如果是规则的数字字母,如

—–BEGIN CERTIFICATE—–
MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh……
—–END CERTIFICATE—–

就是文本的,上面的BEGIN CERTIFICATE,说明这是一个证书
如果是—–BEGIN RSA PRIVATE KEY—–,说明这是一个私钥
这些证书格式之间是可以互相转换的

以下提供了一些证书之间的转换方法:
1. 将JKS转换成PFX
可以使用Keytool工具,将JKS格式转换为PFX格式。
keytool -importkeystore -srckeystore D:\server.jks -destkeystore D:\server.pfx -srcstoretype JKS -deststoretype PKCS12

2. 将PFX转换为JKS
可以使用Keytool工具,将PFX格式转换为JKS格式。
keytool -importkeystore -srckeystore D:\server.pfx -destkeystore D:\server.jks -srcstoretype PKCS12 -deststoretype JKS

3. 将PEM/KEY/CRT转换为PFX
使用OpenSSL工具,可以将密钥文件KEY和公钥文件CRT转化为PFX文件。
将密钥文件KEY和公钥文件CRT放到OpenSSL目录下,打开OpenSSL执行以下命令:
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt

4. 将PFX转换为PEM/KEY/CRT
使用OpenSSL工具,可以将PFX文件转化为密钥文件KEY和公钥文件CRT。
将PFX文件放到OpenSSL目录下,打开OpenSSL执行以下命令:
openssl pkcs12 -in server.pfx -nodes -out server.pem
openssl rsa -in server.pem -out server.key

请注意 此步骤是专用于使用keytool生成私钥和CSR申请证书,并且获取到pem格式证书公钥的情况下做分离私钥使用的,所以在实际部署证书时请使用此步骤分离出来的私钥和申请下来的公钥证书做匹配使用。
云盾证书服务统一使用 PEM 格式的数字证书文件。

SSL证书类型

SSL证书没有所谓的“品质”和“等级”之分,只有三种不同的类型。
SSL证书需要向国际公认的证书证书认证机构(简称CA,Certificate Authority)申请。
CA机构颁发的证书有3种类型:

  • 域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;
  • 企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
  • 增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。


这里我们选择阿里云免费域名(因为服务器等资源都在阿里云,首次试水,后期全部迁移再考虑企业证书)

注册SSL证书

填写完相关信息
开始会要求我们选择生成CSR(Cerificate Signing Request)
强烈建议采用阿里云系统提供的创建CSR功能,避免出现内容不正确而导致的审核失败。关于审核失败,请查看审核失败 - 主域名不能为空。
在申请数字证书之前,您必须先生成证书私钥和证书请求文件(Cerificate Signing Request,简称CSR)。CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心。
在生成CSR文件时会同时生成私钥文件,请妥善保管和备份您的私钥。
生成CSR文件时,一般需要输入以下信息(中文需要UTF8编码):
Organization Name(O):申请单位名称法定名称,可以是中文或英文
Organization Unit(OU):申请单位的所在部门,可以是中文或英文
Country Code(C):申请单位所属国家,只能是两个字母的国家码,如中国只能是:CN
State or Province(S):申请单位所在省名或州名,可以是中文或英文
Locality(L):申请单位所在城市名,可以是中文或英文
Common Name(CN):申请SSL证书的具体网站域名

如果选择手动,则自己生成上传

使用OpenSSL工具生成CSR文件

1、执行命令openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout myprivate.key -out mydomain.csr生成CSR文件。

  • new 指定生成一个新的CSR。
  • nodes指定私钥文件不被加密。
  • sha256 指定摘要算法。
  • keyout生成私钥。
  • newkey rsa:2048 指定私钥类型和长度。

2、生成CSR文件mydomain.csr。

需要输入的信息说明如下:

字段 说明 示例
Country Name
ISO国家代码 (两位字符) CN
State or Province Name 所在省份 ZheJiang
Locality Name 所在城市 HangZhou
Organization Name 公司名称 HangZhou xxx Technologies, Inc.
Organizational Unit Name 部门名称 IT Dept.
Common Name 申请证书的域名 www.example.com
Email Address 不需要输入 -
A challenge password 不需要输入 -

完成命令提示的输入后,会在当前目录下生成myprivate.key(私钥文件)和mydomain.csr(CSR,证书请求文件)两个文件。

注意:在使用OpenSSL工具生成中文证书时需要注意中文编码格式必须使用utf8编码。同时,需要在编译OpenSSL工具时指定支持utf8格式。
如果对中文有需求,推荐您使用keytool工具生成CSR文件。

使用keytool工具生成CSR文件

1、生成证书文件keystore。
证书文件中包含密钥,导出密钥方式请查看主流数字证书都有哪些格式?
执行命令keytool -genkey -alias mycert -keyalg RSA -keysize 2048 -keystore ./mydomain.jks生成keystore证书文件。

  • keyalg 指定密钥类型,必须是RSA。
  • keysize 指定密钥长度为2048。
  • alias 指定证书别名,可自定义。
  • keystore 指定证书文件保存路径。

输入证书保护密码,然后根据下表依次输入所需信息:

问题 说明 示例
What is your first and last name? 申请证书的域名 www.example.com
What is the name of your organizational unit? 部门名称 IT Dept.
What is the name of your organization? 公司名称 HangZhou xxx Technologies,Ltd.
What is the name of your City or Locality? 所在城市 HangZhou
What is the name of your State or Province? 所在省份 ZheJiang
What is the two-letter country code for this unit? ISO国家代码(两位字符) CN

输入完成后,确认输入内容是否正确,输入 Y 表示正确。
根据提示输入密钥密码。可以与证书密码一致,如果一致直接按回车键即可。

2、通过证书文件生成证书请求。
执行命令keytool -certreq -sigalg SHA256withRSA -alias mycert -keystore ./mydomain.jks -file ./mydomain.csr生成CSR文件。

  • sigalg 指定摘要算法,使用SHA256withRSA。
  • alias 指定别名,必须与keystore文件中的证书别名一致。
  • keystore指定证书文件。
  • file指定证书请求文件(CSR)。
    提示输入证书密码即可以生成mydomain.csr。

注意:我们对CSR的密钥长度有严格要求,密钥长度必须是2048位,密钥类型必须为RSA。如果申请证书是多域名或者通配子域名,在“Common Name”或“What is your first and last name?” 字段只需要输入一个域名即可(通配子域名可以输入“*.example.com”等)。

后面,各种下一步

此时需要做DNS域名解析,解析完成检测到即可颁发证书。
但是坑爹的是,不能存在CNAME记录?这怎么可能临时去掉,没办法,撤回重新手动

其中windows服务器其实也没什么大碍,前面的提示还说windows服务器无法查看隐藏目录,其实是可以的
配置完成之后等待一段时间,免费证书会自动签发。

下载安装

主要就是服务器的配置过程

Nginx/Tengine

文件说明:
1、证书文件214207978510820.pem,包含两段内容,请不要删除任何一段内容。
2、如果是证书系统创建的CSR,还包含:证书私钥文件214207978510820.key。
( 1 ) 在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为214207978510820.key;

注:如果是yum安装的nginx,就直接进入配置目录即可

( 2 ) 打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,找到:

# HTTPS server
# #server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}

( 3 ) 将其修改为 (以下属性中ssl开头的属性与证书配置有直接关系,其它属性请结合自己的实际情况复制或调整) :

server {
    listen 443;
    server_name localhost;
    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate   cert/214207978510820.pem;
    ssl_certificate_key  cert/214207978510820.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        root html;
        index index.html index.htm;
    }
}

保存退出。
( 4 )重启 Nginx。
( 5 ) 通过 https 方式访问您的站点,测试站点证书的安装配置。如遇到证书不信任问题,请查看帮助视频。
补充:
如需强制跳转http至https,有如下3种便捷方式

server {  
    listen  192.168.1.111:80;  
    server_name test.com;  
    rewrite ^(.*)$  https://$host$1 permanent;  
}  

或者在index.html中添加meta

<html>  
<meta http-equiv="refresh" content="0;url=https://test.com/">  
</html>  

或者页面调用js

<script type="text/javascript">
var targetProtocol = "https:";
if (window.location.protocol != targetProtocol)
 window.location.href = targetProtocol +
  window.location.href.substring(window.location.protocol.length);
</script>

Apache

文件说明:

  1. 证书文件214207978510820.pem,包含两段内容,请不要删除任何一段内容。
  2. 如果是证书系统创建的CSR,还包含:证书私钥文件214207978510820.key、证书公钥文件public.pem、证书链文件chain.pem。
    ( 1 ) 在Apache的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为214207978510820.key;
    ( 2 ) 打开 apache 安装目录下 conf 目录中的 httpd.conf 文件,找到以下内容并去掉“#”:
#LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
#Include conf/extra/httpd-ssl.conf

( 3 ) 打开 apache 安装目录下 conf/extra/httpd-ssl.conf 文件 (也可能是conf.d/ssl.conf,与操作系统及安装方式有关), 在配置文件中查找以下配置语句:

# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 证书公钥配置
SSLCertificateFile cert/public.pem
# 证书私钥配置
SSLCertificateKeyFile cert/214207978510820.key
# 证书链配置,如果该属性开头有 '#'字符,请删除掉
SSLCertificateChainFile cert/chain.pem

( 4 ) 重启 Apache。
( 5 ) 通过 https 方式访问您的站点,测试站点证书的安装配置,如遇到证书不信任问题,请查看帮助视频。

补充:
1、需要把这些模块开启mod_log_config, mod_setenvif, mod_ssl,socache_shmcb_module
2、如果签名包含所有网站,那么可以提取SSLCertificateFile,SSLCertificateKeyFile,SSLCertificateChainFile配置到virtualhot外面,大家公用一个签名,否则写到里面,每个虚拟站点一个签名。
3、当你的站点使用了HTTPS之后,你可能会想把所有的HTTP请求(即端口80的请求),全部都重定向至HTTPS(即端口443)。这时候你可以用以下的方式来做到:(注意开启Apache mod_rewrite)

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteCond %{SERVER_PORT} 80
 RewriteRule ^(.*)$ https://jb51.net/$1 [R=301,L]
</IfModule>

把这段代码放在.htaccess文件,即可实现HTTP到HTTPS的重定向。
而当你又想用回HTTP的时候,反过来就可以了:

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteCond %{SERVER_PORT} 443
 RewriteRule ^(.*)$ http://jb51.net/$1 [R=301,L]
</IfModule>

其中R=301表示Moved Permanently,即告诉搜索引擎或者浏览器下去直接访问后者的地址,如果只是试验性地重定向,可以使用R=302(Found)。
VirtualHost示例

<VirtualHost *:80>
    ServerAdmin webmaster@domain.cn
    ServerName www.domain.com
    DocumentRoot "d:/wwwroot/newweb/"
    RewriteEngine On
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L]
</VirtualHost>

Tomcat

Tomcat支持JKS格式证书,从Tomcat7开始也支持PFX格式证书,两种证书格式任选其一。
文件说明:

  1. 证书文件214207978510820.pem,包含两段内容,请不要删除任何一段内容。
  2. 如果是证书系统创建的CSR,还包含:证书私钥文件214207978510820.key、PFX格式证书文件214207978510820.pfx、PFX格式证书密码文件pfx-password.txt。

1、证书格式转换
在Tomcat的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,附件中只包含214207978510820.pem文件,还需要将私钥文件拷贝到cert目录,命名为214207978510820.key;如果是系统创建的CSR,请直接到第2步。

到cert目录下执行如下命令完成PFX格式转换命令,此处要设置PFX证书密码,请牢记:

openssl pkcs12 -export -out 214207978510820.pfx -inkey 214207978510820.key -in 214207978510820.pem

2、PFX证书安装
找到安装Tomcat目录下该文件server.xml,一般默认路径都是在 conf 文件夹中。找到 <Connection port="8443" 标签,增加如下属性:

keystoreFile="cert/214207978510820.pfx"
keystoreType="PKCS12"
#此处的证书密码,请参考附件中的密码文件或在第1步中设置的密码
keystorePass="证书密码"

完整的配置如下,其中port属性根据实际情况修改:

<Connector port="8443"
protocol="HTTP/1.1"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="cert/214207978510820.pfx"
keystoreType="PKCS12"
keystorePass="证书密码"
clientAuth="false"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

3、JKS证书安装(帮助)
( 1 ) 使用java jdk将PFX格式证书转换为JKS格式证书(windows环境注意在%JAVA_HOME%/jdk/bin目录下执行)

keytool -importkeystore -srckeystore 214207978510820.pfx -destkeystore your-name.jks -srcstoretype PKCS12 -deststoretype JKS

回车后输入JKS证书密码和PFX证书密码,强烈推荐将JKS密码与PFX证书密码相同,否则可能会导致Tomcat启动失败。

( 2 ) 找到安装 Tomcat 目录下该文件Server.xml,一般默认路径都是在 conf 文件夹中。找到 <Connection port="8443" 标签,增加如下属性:

keystoreFile="cert/your-name.jks"
keystorePass="证书密码"

完整的配置如下,其中port属性根据实际情况修改:

<Connector port="8443"
protocol="HTTP/1.1"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="cert/your-name.jks"
keystorePass="证书密码"
clientAuth="false"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

( 注意:不要直接拷贝所有配置,只需添加 keystoreFile,keystorePass等参数即可,其它参数请根据自己的实际情况修改 )

4、 重启 Tomcat。
5、 通过 https 方式访问您的站点,测试站点证书的安装配置,如遇到证书不信任问题,请查看帮助视频。

IIS7/8

IIS 7/8 支持PFX格式证书,下载包中包含PFX格式证书和密码文件。以沃通证书为例:

文件说明:

  1. 证书文件214207978510820.pem,包含两段内容,请不要删除任何一段内容。
  2. 如果是证书系统创建的CSR,还包含:证书私钥文件214207978510820.key、PFX格式证书文件214207978510820.pfx、PFX格式证书密码文件pfx-password.txt。

( 1 ) 证书导入

  • 开始 -〉运行 -〉MMC;
  • 启动控制台程序,选择菜单“文件"中的"添加/删除管理单元”-> “添加”,从“可用的独立管理单元”列表中选择“证书”-> 选择“计算机帐户”;
  • 在控制台的左侧显示证书树形列表,选择“个人”->“证书”,右键单击,选择“所有任务"-〉"导入”, 根据"证书导入向导”的提示,导入PFX文件 (此过程当中有一步非常重要: “根据证书内容自动选择存储区”)。安装过程当中需要输入密码为您当时设置的密码。导入成功后,可以看到如图所示的证书信息。

( 2 ) 分配服务器证书

  • 打开 IIS8.0 管理器面板,找到待部署证书的站点,点击“绑定”,如图。
  • 设置参数
    选择“绑定”->“添加”->“类型选择 https” ->“端口 443” ->“ssl 证书【导入的证书名称】” ->“确定”,SSL 缺省端口为 443 端口(请不要随便修改。 如果您使用其他端口如:8443, 则访问时必须输入:
    https://www.domain.com:8443)。如图

注意事项

1、API级别迁移,https不会有什么问题,前后兼容即可,等全部迁移完,再取消或者重定向http到https,而网站全站迁移要注意,如果https中还有加载http的js请求,那么浏览器会报错屏蔽,需要所有的子资源接口也迁移至https才行,并且建议所有资源全部迁移https,这是一个麻烦的工程
2、https使用的是443端口,注意防火墙放行,否则浏览器可能会有链接被重置、关闭等错误。
3、SSL协议优先选用更加安全的TLS
4、若一切正常,浏览器会显示一个小绿锁

补充

1、免费的证书供应商:
https://letsencrypt.org/ 90天过期,可以使用crontab定时申请

2、开启http2,性能飞升
配置 http2,这要求 Nginx 版本要大于 1.9.5。HTTP2 具有更快的 HTTPS 传输性能,非常值得开启(关于性能你可以看一下这篇文章)。需要开启HTTP/2其实很简单,只需要在 nginx.conf 的 listen 443 ssl; 后面加上 http2 就好了。如下所示:

listen 443 ssl http2; # managed by Certbot 
ssl_certificate /etc/letsencrypt/live/coolshell.cn/fullchain.pem; # managed by Certbot 
ssl_certificate_key /etc/letsencrypt/live/coolshell.cn/privkey.pem; # managed by Certbot 
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

然后,就 nginx -s reload 就好了。

posted @ 2017-08-01 20:38  leestar54  阅读(626)  评论(0编辑  收藏  举报