HTTPS配置全记录

原创 2017年03月18日 22:06:49

前几天帮肾上TR@SOE(CSDN唯一一个用户名里有特殊字符的用户)部署一个HTTPS,虽然去年写过用Let’s Encrypt证书部署HTTPS的文章,但是这次略有不同,所以作个记录吧,顺便也把常见的做法都说一说。

环境

常见的部署环境和条件有以下几种情况组合:

  • Apache+自签名证书
  • Apache+免费或商业证书
  • Nginx+自签名证书
  • Nginx+免费或商业证书

免费证书和商业证书本质上是一样的,都是可以被系统承认的证书,只是申请方式不同而已。

证书

证书结构

配置一个HTTPS服务所需要的证书包括几个部分:

  • Server Key(服务器私钥)
  • CSR(Certificate Signing Request)
  • CRT(X509 Certificate)

创建证书的基本流程是这样:

  • 生成自己的服务端私钥
  • 输入基本信息并用私钥签名生成CSR
  • 提交CSR给证书机构CA(免费或商业证书)签名生成CRT,或自己做CA签名生成CRT(自签名证书)

其中前两个步骤都是一样的,在这里统一说明一下。

生成服务器私钥:

openssl genrsa -out server.key 4096

输出的server.key文件就是服务器私钥,4096是密钥长度,要求不高的话用2048也可。

生成CSR:

openssl req -new -sha256 -key server.key -out yoursite.csr

因为sha1已经不安全,所以这里用了sha256,可能太旧的客户端(比如win98?)会不支持。

yoursite.csr就是生成的CSR,yoursite建议用你的网站名标识会比较方便识别。

然后按提示输入:

  • 国家
  • 公司
  • 部门
  • 通用名(即网站域名,这个必须准确,有些商业证书支持在这里用带www的域名后签发出同时支持不带www的域名)
  • email
  • 密码(可选,设置的话以后重启webserver都需要输入密码)

自签名证书做法

生成CRT:

openssl x509 -req -days 3650 -in yoursite.csr -signkey server.key -out yoursite.crt

其中签名用的KEY就是自己的服务端私钥,所以这是一个自签名证书。

有效期为3650天(即十年)。

免费证书生成

参见旧文《Let’s HTTPS》。

商业证书生成

首先找一个商业证书机构(CA)或其代理商下一个证书订单。

其次是选择证书类型。

证书类型

商业证书有很多类型,也有很多的CA可以选择,不同的CA,不同的类型价格也不一样。

常见的CA有:

  • VeriSign(Symantec)
  • GeoTrust(RapidSSL)
  • Comodo
  • ……

以上以价格从高到低排序。除此之外当然还有很多,具体可以打开你的系统证书列表看看。

需要特别说一句的就是:臭名昭著的CNNIC和沃通(WoSign,包括免费的StartSSL),已经被证明不安全,建议将它们从系统中删除,并且不要去申请使用它们的证书。

常见的证书类型有三种:

  • DV(域名验证)
  • OV(组织验证)
  • EV(扩展验证)

验证级别从低到高排序,价格也是如此。

DV证书只验证域名,在最终访问者那边查看证书时将不会包含CSR中的组织信息,只有域名信息,也就是说你就算是在CSR里输入你是GOOGLE,到了客户端那里也是看不到的。

OV证书除了验证域名还需要验证组织,即你需要提供证据证明你在CSR里输入的公司或组织的确是你, 这样才能在客户端证书里查看到你的组织信息。

EV证书就要求更高了,通常是金融机构之类的用。

除此之外,证书还有一种区别:

  • 单域名证书
  • 多域名证书
  • 泛域名证书

一样是价格从高到低排序。

单域名证书就是只能用于一个域名的证书,某些商业证书可以提供两个域名:带WWW的和不带WWW的。

多域名证书就是一个证书可以用于多个域名,默认支持三个域名,当然增加域名需要加钱,但比单独买单域名证书要便宜。适用于一个公司有多个域名,而且多个域名部署在一个服务器上,使用一个证书会比较省事,也比较便宜。

泛域名证书就是一个证书可以用于一个域名下的任意多个子域名。

申请流程

一般申请流程(仅指DV类型)如下:

  • 选择CA或代理商
  • 选择证书类型
  • 选择有效期(以年为单位,一般时间越长单价越便宜)
  • 下单付款
  • 成交后按服务商的邮件或文档开始验证域名(以下为一种流程,不同服务商可能不太一样)
    • 上传CSR(或用服务商提供的工具生成,但不推荐)
    • 选择验证方式(EMAIL,文件,DNS等)
    • 按相应方式操作
    • 等待验证
    • 取得证书(邮件或从服务商处自行下载)

其中各验证方式大致如下:

  • Email:证书机构向域名注册邮箱或域名的webmaster等邮箱(可选)发送验证邮件
  • 文件:在域名的指定路径下放验证文件供证书机构访问
  • DNS:创建指定的DNS TXT记录供证书机构验证

通过验证后即可获得证书。

证书内容一般包括:域名的CRT,证书机构的CRT链(可能有多个),根证书CRT(CA的证书),如果用服务商的工具生成CSR,还应该会有CSR和KEY。

部署

分别以最常用的Apache和Nginx为例,其它WebServer请参考相关文档。

Apache

这里只介绍Apache2(以2.4为例)。

HTTPS的基本配置可以直接套用默认配置,只是要改一下证书文件的部分:

SSLEngine on
SSLCertificateFile  /path_to_ssl/yoursite.crt
SSLCertificateKeyFile /path_to_ssl/yoursite.key
SSLCertificateChainFile /path_to_ssl/server-ca.crt

其中yoursite.crt和yoursite.key就是前面说过的私钥和域名证书。

重点说一下server-ca.crt,这个就是前面谈到商业证书时提到的中间证书链(包括CA根证书)。对于Let’s Encrypt这样的免费证书,这个就是Let’s Encrypt的证书(见旧文),对于自签名证书,这一项可以去掉。

中间证书链的生成方法如下:

cat provider.crt provider-parent.crt root.crt > server-ca.crt

很简单,就是把那一堆证书串起来生成一个证书文件即可,不过需要注意顺序,从最低级的证书(你的域名证书的上一级)开始到最高级的CA根证书。

Apache从2.2.12开始支持SNI,可以为多个域名的虚拟主机使用各自独立的证书,用法与HTTP虚拟主机类似,只需要在每个虚拟主机配置里加上相应的证书配置即可。

需要注意的是:WinXP,JAVA6,Android 2.3等不支持SNI。

最后,如我在去年的旧文里所说,SSLv2/v3之类的协议和某些SSL加密算法已经不再安全,所以在没有特定的兼容性需要的情况下,需要配置禁用这些不安全的选项。

在全局配置(注意,不是单个虚拟主机配置里)里加上:

SSLProtocol TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:!DHE-RSA-AES128-GCM-SHA256:!DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES128-SHA:!DHE-DSS-AES128-SHA256:!DHE-RSA-AES256-SHA256:!DHE-DSS-AES256-SHA:!DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

以上协议和加密算法都是目前还安全的,并且提供了最大可能的兼容性。未来如果出现新的安全问题,请自行调整。

Nginx

基本上在旧文里都说过了,这里再总结一下。

相比Apache的配置,Nginx没有单独的中间证书链项目,所以是把中间证书链和域名证书串在一起作为完整的域名证书来用:

cat yoursite.crt server-ca.crt > new_yoursite.crt

配置HTTPS:

ssl on;
ssl_certificate "/path_to_ssl/new_yoursite.crt";
ssl_certificate_key "/path_to_ssl/yoursite.key";

SNI配置见旧文,从略。

全局安全配置:

ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers  ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;

配置完成后重启服务即可生效。

不论是用Apache还是Nginx,都建议配置完HTTPS以后到SSL Labs验证一下安全性。

https配置与部署

Question1.HTTPS证书支持覆盖二级域名吗?2.如何选择证书提供商(CA)?3.如何申请免费的证书?4.使用https后对原来的应用有哪些影响?5.使用https后怎么通过charles抓包...
  • abld99
  • abld99
  • 2017年06月30日 18:32
  • 1416

Https基础以及如何配置Https

一、什么是 SSL 证书,什么是 HTTPS SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现: 1、数据信...
  • nyist327
  • nyist327
  • 2015年02月03日 20:07
  • 12548

配置Tomcat使用https协议(配置SSL协议)

转载地址:http://ln-ydc.iteye.com/blog/1330674 内容概览: 如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 协议 ...
  • jimmy609
  • jimmy609
  • 2014年01月20日 16:38
  • 111178

web项目配置https

tomcat6配置:  1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源  2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址  如果只是加密,我...
  • keketrtr
  • keketrtr
  • 2016年10月20日 09:48
  • 3341

HTTPS 配置

来自:http://wwwww.javaeye.com/blog/94854   项目需要用https与服务器进行连接,获取系统需要的一些配置参数。以前是用http进行连接的,客户端代码比较简单,...
  • Uoooo
  • Uoooo
  • 2011年05月06日 16:17
  • 7218

阿里云云虚拟主机上个人网站的Https访问配置

本文基于阿里云云虚拟主机,我个人网站是基于Hexo博客系统搭建的静态网站,所以搭建Https相对方便 一、获取HTTPS安全证书在操作之前,请将你的域名的隐私保护去掉,让证书服务商能通过域名解析查看到...
  • chwshuang
  • chwshuang
  • 2016年09月05日 20:22
  • 33629

Apache 使用ssl模块配置HTTPS(Centos7 httpd2.4.6)

Web服务器在默认情况下使用HTTP,这是一个纯文本的协议。正如其名称所暗示的,纯文本协议不会对传输中的数据进行任何形式的加密。而基于HTTP的Web服务器是非常容易配置,它在安全方面有重大缺陷。任何...
  • Dexter_Wang
  • Dexter_Wang
  • 2017年02月02日 13:50
  • 8397

HTTPS的配置

在基于spring框架下使用HTTPS技术需要对Tomcat服务器以及Spring进行配置。 首先使用java命令:keytool jdk1.7中keytool命令列表如下: -certreq ...
  • lizijie7471619
  • lizijie7471619
  • 2017年05月31日 17:02
  • 672

配置https实现请求安全

简单的说,https可以称之为http的安全版本,使用https可以保护我们的敏感数据,特别是在用户登陆、交易等场景下,尤其需要防止数据被截取、篡改。 下面以nginx为例,介绍一下nginx服务器配...
  • leiswpu
  • leiswpu
  • 2015年09月17日 18:31
  • 1254

nginx配置HTTPS

使用ssl模块配置同时支持http和https并存一,生成证书# 1、首先,进入你想创建证书和私钥的目录,例如: cd /etc/nginx/# 2、创建服务器私钥,命令会让你输入一个口令: open...
  • weixin_35884835
  • weixin_35884835
  • 2016年09月19日 18:23
  • 54541
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HTTPS配置全记录
举报原因:
原因补充:

(最多只允许输入30个字)