ssl(https)部署指南

来源:互联网 发布:花无涯 网络黑白 编辑:程序博客网 时间:2024/05/21 11:30

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设置

此问题在设置的过程中由于在内网时使用的证书无法让浏览器信任,必须手动导入,由此只能通过两张证书在进行合作配置。


原创粉丝点击