apache tomcat https应用

2.5 使用OpenSSL来签证书

OpenSSL就是这么一个自签,加密的命令行工具,它是从UNIX下分离出来的一个项目,但也有FOR WINDOWS平台的,比如说我给你们用的这个OPENSSL,就是For WIN的,但是由于它是从UNIX/LINUX下产生的,因此它内部的配置还是用的是LINUX/UNIX的盘符与路径,需要手动去校正,当然我已经做好了校正,因此直接打了个压缩包放在了FTP上,大家拿下来后解压后就可以直接用了。

如果你们是自己从网上官方网站下载的OPENSSL需要手动去改它的盘符和路径,要不然是用不起来的。

ü   设置环境变量

 

把c:\openssl\bin\openssl.cnf设成OPENSSL_CONF这样的一个变量,同时把c:\openssl\bin目录加到你的path里去(根据你们自己的解压后的openssl的实际路径)。

ü   生成根证书所用的密钥

 

提示输入密码我们使用:aaaaaa

再次输入确认密码

(密钥,由其是private key是由口令保护的)

去除CA密钥的口令

 

为什么我们要把好好的口令保护给去除呢?这边不是去除而是代表这个证书在被应用程序启动时不需要显示的提示用户输入口令,要不然我们会出现下面这种情况:

在启动HTTPS协议的服务器时,一般我们点一下service->apache2.x启动,就启动了,但如果这个https所带的证书是没有经过上述这道手续后处理的话,这个服务在启动时会失败,而需要切换成手动命令行启动,就是黑屏!在黑屏状态下,apache2.x服务器启动时会提示你要求:输入口令,这个太麻烦了,一般启动服务器服务的一定是超级管理员,因此一般情况下没必要在启动相关服务时再输入一遍口令了。

ü   生成CA即ROOT CA证书并自签

 

网上有很多说法,说是先产生CA的Request请求,再用ca.key去自签,我给大家介绍一条一步到位的产生ca ROOT证书的命令,为了安全,我们在最后加上“-configC:\openssl\bin\openssl.cnf”,以使openssl工具可以找到相应的config文件(有些系统在指定了OPENSSL_CONF环境变量后一般就不需要在命令行里去手工指定这个-config变量了)。

由于我们产生的证书为:X509格式,因此需要按照X509格式填入相关的值。

²  AU-国家家的缩写,如:CHINA=CN,美国=USA,英国=UK,日本=JP

²  State or Province Name-省/洲的缩写或者是全称,如:上海=SH

²  Locality Name-城市的全称或者是缩写,如:上海=SH

²  Organization Name-公司名,如:Cognizant

²  Common Name-要安装这台证书的主机名,证书是和主机名绑定的如果证书里的主机名和你实际的主机名不符,这张证书就是非法的证书

我们不能够填IP,一定一定要填主机名即域名www.xxx.com这样的东西,比如说我填的是shnlap93,但我的主机怎么知道shnlap93是指:10.225.106.35或者说是指localhost这台机器呢?

打开C:\Windows\System32\drivers\etc\hosts这个文件,如下:

localhost shnlap93

10.225.106.35 shnlap93

看到了吧?所以当我们使用pint shnlap93时,它是不是就可以知道shnlap93=10.225.106.35啦?

EmailAddress-邮件地址,爱填不填,可以跳过,反正我们是“自签”。

 

Look,我们的CA证书生成了,可以双击这张证书,查看信息后关闭它。

目前这张ROOT 证书,只是个自签的产品,因为是自签,一般其它客户端的IE里因此是不会带有这张根证书的。

要其实客户端也能信任这张根证书,我们必须怎么办?

将它安装到我们的IE的信任域里。

ü   将ROOT CA导入客户端的根级信任域,有多少台客户端,每个客户端都要导一边这个证书!

所以说如果我们拥有世界级的根证书该多好啊,电脑上默认就带有我们的证书,因此知道这帮世界级的根证书机构为什么能挣钱了吧?50-500美金签张证书,几秒钟的事,CALL!!!

 

点[导入]按钮

 

下一步,下一步,此时会有一个弹出框,选“yes(是)”完成导入。

再来打开我们的ca.crt文件

 

发现了没有,这张证书是有效的证书了,所以在“证书信息”前原有的一个红叉叉,消失了。

ü   生成Web服务器端证书密钥

我们的root证书有了,现在可以生成Web服务器端的证书了,并且用root ca去签名

 

先生成密钥,密码6个a

 

去除密码(提示:enter pass phrase for server.key时输入刚才生成密钥时的密码即6个a。

ü   生成Web服务器端证书的签名请求

 

生成服务器端证书请求时需要输入server端key的口令,我们为了方便,也用6个a。

ü   用Root CA去对Web服务器的证书请求即csr(certificate request)进行签名认证

 

输入y并回车

此时它会提示:

1 out of 1certificate requests certified, commit? [y/n],再输入y并回车

 

Web服务器的server.crt证书生成完毕。

注:

如果在操作时有任何错,必须连同生成的.key,.csr, .crt文件全部删除重头来一遍

我们来看看,这个server.crt文件,双击它。

 

首先,我们看到该证书的“证书信息”前没有红色的大叉,然后是证书信息正是我们刚才输入的内容,为什么没有大叉?

因为我们的RootCA根证书装在我们IE的根级信任域里,又因为我们的客户端信任我们的RootCA,因此当我们的客户端打开由RootCA签出来的server.crt时,这根“信任链”被建立了起来,所以客户端自动单向信任我们的server.crt,对不对?

下面我们来做一个实验,把我们的Root CA从我们的根级信任域中删除。

 

选中这个shnlap93的根级证书,点[删除],会弹出两次确认框,选“yes”确认删除掉它。

关闭IE,然后我们再次双击我们的server.crt文件,来查看证书内容。

 

我们看到了什么?“不能验证该证书。

重新导入我们的Root CA至IE的根级信任域(见将ROOT CA导入客户端的根级信任域)。

再次打开server.crt查看证书内容。

 

一切回复正常了。

2.6 为Apache HttpServer布署https协议

ü   用文本编辑器打开httpd.conf文件,找到如下这一行

#Include conf/extra/httpd-ssl.conf

这行默认是被注释掉的,因此请把它放开,修改成如下

Include conf/extra/httpd-ssl.conf

ü   打开D:\tools\httpd\conf\extra\里的httpd-ssl.conf文件

在开头处添加如下这一行语句

#

# This is the Apache server configuration file providing SSL support.

# It contains the configuration directives to instruct the server how to

# serve pages over an https connection. For detailing information about these

# directives see <URL:http://httpd.apache.org/docs/2.2/mod/mod_ssl.html>

#

# Do NOT simply read the instructions in here without understanding

# what they do.  They're here only as hints or reminders.  If you are unsure

# consult the online docs. You have been warned. 

#

LoadModule ssl_module modules/mod_ssl.so

然后找到下面这一行

SSLCertificateFile "D:/tools/httpd/

把它改成:

SSLCertificateFile "D:/tools/httpd/cert/server.crt"

再找到下面这一行

SSLCertificateKeyFile "D:/tools/httpd/

把它改成

SSLCertificateKeyFile "D:/tools/httpd/cert/server.key"

然后把我们在我们的Apache HttpServer的安装目录下手工建一个目录叫cert的目录,并把我们在前面生成的server.crt与server.key文件拷入d:\tools\httpd\cert目录内。

在httpd.conf文件中搜索“ServerName”

搜到下面这样的一句

ServerName 10.225.101.35:80

把它改成你的主机名

ServerName shnlap93:80

此处的shnlap93是你的主机名

再继续在httpd.conf文件中搜索“VirtualHost *”

搜到下面这一句

<VirtualHost *>

把它改成

<VirtualHost shnlap93:80>

在D:\tools\httpd\conf\extra\httpd-ssl.conf文件中查找

搜“VirtualHost _default_:443”

然后把位于< VirtualHost _default_:443>段内的头三行改成如下格式

²  确保你的http的发布目录在d:/www

²  确保你的HTTPS的主机名为shnlap93:443(这边的名字和生成证书里的common name必须完全一模一样连大小写都必须一样)

DocumentRoot "D:/www"

ServerName shnlap93:443

ServerAdmin admin@localhost

然后在下一个“</VirtualHost>  ”结束前,填入下面这几行语句

DirectoryIndex index.html index.htm index.jsp index.action

 

JkMount /*WEB-INF ajp13

JkMount /*j_spring_security_check ajp13

JkMount /*.action ajp13

JkMount /servlet/* ajp13

JkMount /*.jsp ajp13

JkMount /*.do ajp13

JkMount /*.action ajp13

 

JkMount /*fckeditor/editor/filemanager/connectors/*.* ajp13

JkMount /fckeditor/editor/filemanager/connectors/* ajp13

 

在重启我们的Apache服务前先Test Configuration一下,如果一切无误,可以重启了。

然后我们来实验一下我们的Web Server的https的效果

 

看到没有,这个红圈圈起来的地方,目前是正常的,显示金黄色的一把钥匙。

如果你的Root CA没有装入IE的根级信任域,此时你敲入https://shnlap93/cbbs时,你会被提示说“该证书不被任何”,然后让你点一下“确认”按钮,点完信任后能进入我们的Web应用,但是,原先应该显示“金黄色钥匙”的地方会显示一个红色的圈圈,并且当你查看证书信息时,这个地方也会显示“证书不受信任”,并且显示一个红色的大叉

2.7 为Tomcat也布署https协议

我们的Apache HttpServer已经走https协议了,不是已经enough了吗?NO,远远不够,如果你没有用到任何App Server即tomcat/weblogic/was那么我们说我们的应用已经走https协议了,但是因为我们的架构是Web Server + App Server因此,我们的App Server也必须走https协议

如果只是Web Serverhttps协议,而App Server没有走https协议,这就叫“假https架构”,是一种极其偷赖和不负责任的做法。

概念同产生Apache的HttpServer的证书一样,只是这边的信任域有点不一样。

Web的信任域就是你的IE里的内容里的证书里的“根级信任域”,App Server的信任域是打不开也不能访问这块地方的,而且App Server的信任域格式也不是crt文件,而是.jks(javakey store的简称)

下面来做一个tomcat的https布署。

原有ca.crt和ca.key继续有用,因为ROOT CA都是一个,而且必须一定始终是唯一的一个,对吧?

我们直接从server.jks来做起。

说JKS,这东西好玩的很,jks文件其实就是把key文件与crt文件合在一起,以java key store的格式来存储而己

2.8 生成Tomcat的SSL证书

为Tomcat的server所在的服务器生成一个server.jks文件

很多网上的资料是拿原先的server.crt文件转成keystore文件,其实是不对的,需要单独生成一张server.jks文件。

怎么生成证书?回顾一下上文:

1)  生成KEY

2)  生成证书请求

3)  用CA签名

下面开始使用%JAVA_HOME%\bin目录下的keytool工具来产生证书

ü   生成JKS密钥对,密码使用6个a,alias代表“别名”,CN代表Common Name,必须与主机名完全一致,错了不要怪我自己负责。

keytool -genkey -alias shnlap93X509 -keyalg RSA -keysize 1024 -dname "CN=shnlap93, OU=insurance-dart, O=Cognizant, L=SH, S=SH, C=CN" -keypass aaaaaa -keystore shnlap93.jks -storepass aaaaaa

ü   生成JSK的CSR

keytool -certreq -alias shnlap93X509 -sigalg "MD5withRSA" -file shnlap93.csr -keypass aaaaaa -keystore shnlap93.jks -storepass aaaaaa

此处注意:

Alias名必须和上面一致

密码和上面一致

ü   使用openssl结合ca.crt与ca.key为jsk的csr来签名认证并产生jks格式的crt

openssl x509 -req -in shnlap93.csr -out shnlap93.crt -CA ca.crt  -CAkey ca.key -days 3650 -CAcreateserial -sha1 -trustout -CA ca.crt -CAkey ca.key -days  3650 -CAserial ca.srl -sha1 -trustout

提示yes和no时选yes

         于是,我们有了一张符合jks格式的crt证书叫shnlap93.crt文件,来查看它。

 

 

证书上没有红色的大叉,因为我们的Root CA装在我们的IE的根级信任域中,OK,下面来了,生成这个JKS,就是把crt和key合在一起,来了!

ü   生成符合x509格式的jks文件

1)      将Root CA导入jks信任域

keytool -import -alias rootca -trustcacerts -file ca.crt -keystore shnlap93.jks -storepass aaaaaa

前面我说了,jks信任域是读不到IE的根级信任域的,因此要手动把ca.crt文件导入jks的信任域

 

1)      现在我们的shnlap93.jks文件中有两个realm(域),一个是:

²  本身的csr(产生的签书请求认证的域还没被认证因为认证的内容变成了shnlap93.crt文件了是不是?)

²  刚才步骤中导入的Root CA认证域

那么客户端信任Root CA没有问题,但由于server端本身的信任域还只是处于“请求被签名”的状态,那么客户端如何去信任这个jks文件呢?

答案就是:补链补这根信任链!

keytool -import -alias  shnlap93X509 -file shnlap93.crt -keystore shnlap93.jks -storepass aaaaaa

 

我们不是生成过shnlap93.crt吗?把它导入jks不就是能够把原有的“正在处于请求被签名认证”这个状态改成“已经被Root CA签名认证” 了吗?对吧?

所以,我们用于布署tomcat的ssl证书的jks格式的文件shnlap93.jks已经完整了。

2.9 布署Tomcat上的Https协议

Apache HttpServer走的是443端口,Tomcat走的就是8443端口。

打开tomcat的conf目录下的server.xml,我们来找下面这一段:

    <!--

    <Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443"

               />

    -->

默认情况下,它是被由“<!--  -->”这样的标签给注释起来的,我们把它放开

<!-- enable tomcat ssl -->

    <Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443"

               clientAuth="false" sslProtocol="TLS"

               keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa"

    />

²  clientAuth=”false”

如果该值为”true”就代表要启用双向认证

²  keystoreFile就是我们生成的keystore文件所在的完全路径

²  keystorePass就是我们生成keystore时的password

重启tomcat,输入https://shnlap93:8080/cbbs, 可以看到登录网页,且右上方的SSL连接信息为“金黄色的钥匙”而不是红色大叉,那么一切就成功了。

重启Apache,然后在ie地址栏输入: https://shnlap93/cbbs,用sally/abcdefg,一切成功。

注意:

当启用了https协议后,你在ie地址栏就不能再用localhost了,为什么?因为我们的证书中的CN(Common Name)填入的是主机名,如果你还用:https://localhost,那么你也能正常进入网址,只是多了几步https不被信任的警告框,并且你右上角的ssl连接信息为红色的大叉,对于这样的https连接,如果换成是购物网站,你敢信任吗?

2.10 apache https + tomcat https

²  假https

前面说过,如果你是在Apache上启用了https而没有在tomcat上启用https协议,那么我们在tomcat中布署一个servlet,含一条打印语句: System.out.println(“”+request.getScheme()),那么它将打印出来http

²  真https

如果我们在Apache上启用了https通时在tomcat上也启用了https,那么我们如果有这样的一条语句:System.out.println(“”+request.getScheme()),它打印出来的将是:https

转载于:https://www.cnblogs.com/dsios/p/3445198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值