您的位置:首页 > 运维架构 > Tomcat

Apache Tomcat SSL配置

2014-04-16 16:49 411 查看

1 创建OpenSSL自签名证书

1.1 概述

本节简单地展示了SSL的实现原理和证书在整个SSL过程中扮演的角色。

普通的WEB以非加密的形式传输数据。这意味着任何人都能够通过嗅探器窥测到所有的数据。显然,这是一个问题,特别是对安全和隐私有高要求的数据,例如:信用卡数据和银行事务数据。安全套接层用于加密WEB服务器和WEB客户端(浏览器)之间传输的数据流。

SSL使用所谓的非对称加密技术,通常也称之为公钥加密(PKI)。使用公钥加密,需要创建一个公钥和一个私钥。使用一个密钥加密的数据,只能被另一个密钥解密。使用服务器的私钥进行加密的消息和数据流,只能使用对应的公钥进行解密,这样就能保证客户端收到的数据只来自于特定的服务器。

如果SSL使用公钥加密技术加密传输的数据流,为什么还需要一个证书呢?从技术上来讲,证书并不是必需的,因为数据已经被加密,并且很难被第三方解密。尽管如此,证书在通信过程中确实扮演了一个重要的角色。由可信的证书认证机构签名的证书,能够确保证书持有者确实具有他声明的身份。如果没有可信的签名证书,你的数据也会被加密,但是,你通信的机构也许并非你所认为的机构。没有证书,假冒攻击会更加普遍。

1.2 步骤1:生成私钥

openssl工具箱既能够用于生成RSA私钥和CSR(证书签名请求),也能用于生成自签名的证书(主要用于测试和内部使用)。

第一步生成RSA私钥。RSA私钥是一个1024位的RSA密钥,使用Triple-DES加密,以PEM格式存储,这样该私钥就是一个可读的ASCII文本。生成RSA私钥命令行如下:

$ opensslgenrsa -des3 -out localhost_server.key 1024

GeneratingRSA private key, 1024 bit long modulus
..............................................................................++++++
.++++++
e is 65537(0x10001)
Enter passphrase for localhost_server.key:changeit
Verifying - Enter pass phrase for localhost_server.key:changeit

1.3 步骤2:生成CSR(证书签名请求)

一旦生成了私钥,就可以生成证书签名请求了。CSR有两种使用方式。理想情况下,将CSR发送给Thawte或Verisign等证书认证机构,证书认证机构将会验证请求者的身份并签署一个签名的证书。第二种方式是自签名CSR,这个将在1.5节进行演示。

在CSR的生成过程中,你需要输入一些信息。这些信息是证书的X.509属性。其中一个信息是“Common Name(例如你的名字)”。该信息最好填入受保护服务器的完全限定域名。如果受保护的站点是https://public.akadia.com,那么该信息填入public.akadia.com。生成CSR的命令行如下:

$ openssl req -new -key localhost_server.key -out localhost_server.csr
Enter passphrase for localhost_server.key: changeit
You areabout to be asked to enter information that will be incorporated
into yourcertificate request.
What youare about to enter is what is called a Distinguished Name or a DN.
There arequite a few fields but you can leave some blank
For somefields there will be a default value,
If youenter '.', the field will be left blank.
-----
CountryName (2 letter code) [AU]:CN
State orProvince Name (full name) [Some-State]:Beijing
LocalityName (eg, city) []:Beijing
OrganizationName (eg, company) [Internet Widgits Pty Ltd]:Your_org
OrganizationalUnit Name (eg, section) []:Your_org
CommonName (e.g. server FQDN or YOUR name) []:localhost
EmailAddress []:ping.wang@your_org.net

Pleaseenter the following 'extra' attributes
to be sentwith your certificate request
Achallenge password []:changeit
An optional company name []:Your_org

1.4 步骤3:从私钥中移除口令

使用口令加密的私钥有一个副作用:每次启动Apache的时候,它都会请求口令。显然这并不是很方便,没人想在每次重启和宕机之后都输入口令。mod_ssl能够使用一个外部的程序代替内置的口令对话框,尽管如此,这也不是最安全的选项。从密钥中移除Triple-DES加密是可行的,移除口令之后就不再需要每次输入口令了。如果密钥不再加密,那么请确保这个文件只有root用户可读。如果你的机器被盗用或者有第三方获取过你没有加密的私钥,那么请取消对应的证书。先将1.2节生成的localhost_server.key重命名成localhost_server.key.org,然后使用如下命令从密钥中移除口令:

$ openssl rsa -in localhost_server.key.org -out localhost_server.key
Enter passphrase for localhost_server.key.org: changeit
writing RSA key

1.5 步骤4:生成自签名的证书

如果你不希望证书认证机构签名你的证书,或者当证书认证机构还在签名你的证书时,你想测试你的SSL实现,那么你就需要生成一个自签名的证书。客户端浏览器收到这个证书时,会产生一个错误,告知客户签名的证书机构是未知并且不可信的。

执行如下命令,生成一个一年有效期的临时证书:

$ openssl x509 -req -days 365 -in localhost_server.csr-signkey localhost_server.key -out localhost_server.crt
Signatureok
subject=/C=CN/ST=Beijing/L=Beijing/O=Your_org/OU=Your_org/CN=localhost-new.tuanguwen.com/emailAddress=ping.wang@your_org.net
Getting Private key

1.6 步骤5:安装私钥和证书

如果安装了mod_ssl,Apache会在config目录创建几个目录。依赖于Apache编译的方式,目录的位置会有不同。

cp localhost_server.crt/usr/local/apache/conf/ssl.crt

cp localhost_server.key/usr/local/apache/conf/ssl.key

1.7 配置启用SSL的虚拟主机

SSLEngine on

SSLCertificateFile/usr/local/apache/conf/ssl.crt/ localhost_server.crt

SSLCertificateKeyFile/usr/local/apache/conf/ssl.key/ localhost_server.key

SetEnvIf User-Agent".*MSIE.*" nokeepalive ssl-unclean-shutdown

CustomLog logs/ssl_request_log \

"%t %h %{SSL_PROTOCOL}x%{SSL_CIPHER}x \"%r\" %b"

1.8 重启Apache并测试

/etc/init.d/httpdstop

/etc/init.d/httpdstop

https://public.akadia.com

2 配置ApacheTomcat SSL

以下配置以Apache Tomcat 7.0.52为例。

2.1 配置APR SSL

2.1.1 拷贝私钥和证书

APR SSL使用openssl生成的私钥和自签名证书,因此根据第1节内容生成的私钥和自签名证书即可满足要求。私钥和自签名证书生成完毕后,将其拷贝到${catalina.base}/conf/下即可(${catalina.base}即tomcat根目录)。

2.1.2 增加SSL APR Connector配置

修改server.xml,添加如下配置:

<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
SSLEnabled="true"
SSLCertificateFile="${catalina.base}/conf/localhost_server.crt"
SSLCertificateKeyFile="${catalina.base}/conf/localhost_server.key" />


2.2 配置JSSE SSL

2.2.1 生成JSSE keystore文件

使用如下命令创建自签名的keystore文件:

$ keytool -genkey -alias tomcat -keyalg RSA -keystoretomcat.keystore
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: localhost:8443
您的组织单位名称是什么?
[Unknown]: Your_org
您的组织名称是什么?
[Unknown]: Your_org
您所在的城市或区域名称是什么?
[Unknown]: Beijing
您所在的省/市/自治区名称是什么?
[Unknown]: Beijing
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN= localhost:8443,OU=Your_org, O=Your_org, L=Beijing, ST=Beijing, C=CN是否正确?
[否]: y

输入 <tomcat>的密钥口令
(如果和密钥库口令相同,按回车):

执行以上命令之后,就会生成tomcat.keystore文件,将其拷贝至${catalina.base}/conf/下即可(${catalina.base}即tomcat根目录)。

2.2.2 增加SSL NIO/BIO Connector配置

修改server.xml,添加如下配置:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${catalina.base}/conf/tomcat.keystore" keystorePass="1121231234"
clientAuth="false" sslProtocol="TLS"/>


以上配置增加了一个SSL NIO Connector,如果你想增加SSL BIO Connector,将protocol属性改为org.apache.coyote.http11.Http11Protocol即可。

其中keystorePass为2.2.1节生成keystore文件时输入的口令。

3 HTTPS工作原理

1. 浏览器将自己支持的一套加密规则发送给服务器。

2. 服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址加密公钥,以及证书的颁发机构等信息。

3. 浏览器获得网站证书之后浏览器要做以下工作

1) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。

2) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的对称密钥,并用证书中提供的公钥加密。

3) 使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。

4. 服务器接收浏览器发来的数据之后要做以下的操作:

1) 使用自己的私钥将信息解密取出对称密钥,使用对称密钥解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。

2) 使用对称密钥加密一段握手消息,发送给浏览器。

5. 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。

6. 使用浏览器生成的对称密钥加密数据,并进行传输。



图1:HTTPS工作原理序列图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: