Author:Chinvi(lujw)
这东西是在去年年初整理写的的,放在自己的学习资料,最近看到就想着顺便PO出来,里面有问题的地方请多指教,各位大神轻喷。
废话不多说,上干货。
一、 相关介绍
1. HTTPS:
在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。 http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层 的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。
2. SSL(Secure Socket Layer):
是Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在https协议栈中负责实现上面提到的加密层。因此,一个https协议栈大致是这样的:
图1.2 https协议栈
3. 数字证书:
一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。
4. 加密和认证:
加密是指通信双方为了防止铭感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的非法者,采取的确认身份的方式。只有同时进行了加密和认证才能保证通信的安全,因此在SSL通信协议中这两者都被应。早期一般是用对称加密算法,现在一般都是不对称加密,最常见的算法就是RSA。
5. SSL 握手过程:
图 1.5 SSL 握手过程
二、 https证书分类
1. 自签名证书
自签名证书,顾名思义便是自己制作的数字安全证书,自签名由于是自己制作的,没有相关机构认证,所以无法让各大浏览器信任,这是缺点,但是对于某些需求还是需要自签名,比如内网,内网是无法再ca认证机构申请证书(原因是ip地址不符合)。自签名证书制作流程如下(单向验证):
1) cmd定位到JDK的bin目录下
图 2.1.1 流程1
2) 为服务器生成证书
keytool -genkey -keyalg RSA -dname"cn=10.1.27.177,ou=toone,o=vbase,l=guangdong,st=zhuhai,c=cn" -aliasserver -keypass 111111 -keystore lujw.keystore -storepass 111111 -validity 365
注:cn=127.0.0.1配置的是服务器IP
图 2.1.2 流程2
此时会生成一个lujw.keystre证书库的文件。
图 2.1.3 流程3
3) 生成csr
生成csr文件用于提交CA认证生成证书使用。
keytool -certReq -alias server -keystore lujw.keystore-file ca.csr
图 2.1.4 流程4
4) 生成cer
这个ca.cer是为了解决不信任时要导入的(手工导入)
keytool -export -alias server -keystore lujw.keystore-file ca.cer -storepass 111111
图 2.1.5 流程5
图 2.1.6 证书库及其证书文件
5) 进行容器配置
以上通过keytool产生的相关证书文件只是一个例子,还有产生其他文件(同样可以使用在以上场景)的其他例子,其中的原理不在我们这里所讨论的范围。但是以上所产生的文件已经足够我们在各容器使用了。
2. CA机构颁发的证书(以wosign为例子)
9月30号起暂时停止提供免费证书申请通道,原因是安全问题。CA机构颁发的证书和自签名产生的文件的格式不同,但是功能是相同的。原因是CA机构在浏览器的认证过程与自签名不一样。
三、 各容器部署
以下各容器的证书皆采用自签名证书实例,原因在各个ca机构在颁发免费证书的时候基本都有各个容器的部署指南。网址如下:
http://www.wosign.com/Docdownload/index.htm
1. Tomcat
首先找到安装 Tomcat 目录下该文件“Server.xml”,一般默认路径都是在 Conf 文件夹 中。然后用文本编辑器打开该文件,接着找到如下所示
图 3.1
(注意:不要直接拷贝所有配置,只需添加keystoreFile,keystorePass 这两个参数即可!) 默认情况下是被注释的,我们可以把“”去掉, 然后对其节点进行相应的修改,比如:port:端口号;keystoreFile:证书路径(例如:conf/SSL.jks); keystorePass:证书密码。
其中,端口443是ssl中的一个协议端口,用在https服务中,clientAuth则设置了该端口是否需要进行双向认证,False为不需要。
2. Jetty
jetty的配置修改/etc/ jetty-ssl.xml文件:
<Configure id="Server"class="org.eclipse.jetty.server.Server">
<!-- if NIO is not available, useorg.eclipse.jetty.server.ssl.SslSocketConnector -->
<Call name="addConnector">
<Arg>
<Newclass="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
<Setname="Port">443</Set>
<Setname="maxIdleTime">30000</Set>
<Setname="Acceptors">2</Set>
<Setname="AcceptQueueSize">100</Set>
<Setname="Keystore"><SystemProperty name="jetty.home"default="." />/etc/wosign.com.jks</Set>
<Setname="Password">123456</Set>
<Setname="KeyPassword">123456</Set>
<Setname="truststore"><SystemProperty name="jetty.home"default="." />/etc/wosign.com.jks</Set>
<Setname="trustPassword">123456</Set>
</New>
</Arg>
</Call>
</Configure>
修改start.ini文件:删除注释#etc/jetty-ssl.xml
启动:
点击ca.cer文件导入证书,
重启,成功。
3. Apache
1) 打开 apache 安装目录下 conf 目录中的 httpd.conf 文件,找到 #LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
#Includeconf/extra/httpd_ssl.conf 删除行首的配置语句注释符号“#” 保存退出。
2) 打开 apache 安装目录下 conf/extra 目录中的 httpd-ssl.conf 文件 (注释:yum 安装配置目录:conf.d/ssl.confubuntu/apache2 安装目录:conf/sites-enabled/*.conf )
在配置文件中查找以下配置语句:
a) 添加 SSL 协议支持语句,关闭不安全的协议和加密套件
SSLProtocolall -SSLv2 -SSLv3
b) 修改加密套件如下 SSLCipherSuiteAESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
c) 将服务器证书公钥配置到该路径下(在 conf 目录下创建 ssl 目录,将for Apache 里面的三 个证书文件拷贝到 ssl 目录下) SSLCertificateFile conf/ssl/test.wosign.com.crt (证书公钥)
d) 将服务器证书私钥配置到该路径下
SSLCertificateKeyFileconf/ssl/test.wosign.com.key (证书私钥)
e) 将服务器证书链配置到该路径下
#SSLCertificateChainFileconf/ssl/1_root_bundle.crt(证书链)
删除行首的“#”号注 释符 保存退出,并重启 Apache。
重启方式:
3) 进入 Apache 安装目录下的 bin 目录,运行如下命令
./apachectl-k stop
./apachectl-k start
4. OSGI(内嵌jetty):有需要可私信我。
四、 https请求
1. 浏览器相服务器发起https请求
在容器部署完成之后即可在浏览器进行https请求,如下:
图4.1.1 浏览器进行https请求
图4.1.2 https请求统一认证系统
2. 服务器向服务器发起https请求
服务器向服务尽情https请求可通过对服务器进行GET请求做验证,分析如下:
1) 正常请求方式(GET)
l 通过Jdk原生的HttpsURLConnection的方式
l 通过Apache 的httpclient(4)
2) 访问时的证书绕行选择
l 证书
l 绕过证书
3) 性能对比
HttpsURLConnection在执行过程使用的是jdk原生的HttpsURLConnection,性能相对比较高,而httpclient执行时大部分时间用在execute方法中。
不过相对于http直接请求,https则需要多给出时间放在服务端客户端的握手是的加解密中。
四、 相关问题
1. 内外网的ssl设置
此问题在设置的过程中由于在内网时使用的证书无法让浏览器信任,必须手动导入,由此只能通过两张证书在进行合作配置。