一、数字证书准备
在本地配置的时候,路径不同,注意修改过来
关于数字证书部分我是用openssl做的,也是个开源的软件,前不久刚刚发布了1.0版本(做了11年才正式发布,由衷的佩服,老外真是有股哏劲)。网上很多文章介绍用java自带的keytool命令完成,我没有试过,不过看文章介绍好像keytool没有CA认证的功能。下面开始数字证书相关操作。
1. 下载、安装openssl(好像是废话)
Openssl建议大家用1.0版本,毕竟是正式版本。我用的时候正式版还没出来,当时用的是OpenSSL 0.9.8m,不要用OpenSSL 0.9.8h这个版本(有个bug,会影响到后面的操作)。安装后从命令行进入安装目录下的bin目录。Ready! GO!。
2.创建CA的私钥
执行以下命令openssl genrsa -des3 -out ../demo/ca/ca.key 1024
demo是我的工作目录,接下来会提示你输入密码,后面用到的密码会很多,最好都认真记下来。
3.创建CA证书
openssl req -new -x509 -key ../demo/ca/ca.key -out ../demo/ca/ca.crt -days 365
x509是一种加密的标准,-out是指输出的文件路径,-key是指定私钥,也就是上一步生成的那个,-days是指证书有效期。
注:再输入common name时你可以指定你自己的名字,但是不能输入你的服务器名(www.XX.X.com)
4.创建server端的私钥
因为咱们是要在server端提供SSL的webservice,所以在server端需要使用私钥库和信任库。
openssl genrsa -des3 -out ../demo/server/server.key 1024
5.创建server证书签名请求
我们可以发送签名请求到一个官方的CA机构,这些机构都是要收费的,而且还要严格审核,至于我们自己开发过程中的话实在是没必要。我们直接发送到我们刚才通过openssl构建的CA就可以了。
openssl req -new -key ../demo/server/server.key -out ../demo/server/server.csr
注意这里的common name,此处填写你的服务器的ip或者域名,例如localhost,也就是你要为哪台服务器做证书就指定那台机器。
6.CA签署server证书
如果是第一次通过CA签署证书的话,执行如下命令
openssl x509 -req -days 30 -in ../demo/server/server.csr -CA ../demo/ca/ca.crt-CAkey ../demo/ca/ca.key -CAcreateserial -out ../demo/server/server.crt
其中的-CAcreateserial是指创建一个新的序列文件。这样openssl会在当前目录下创建一个名为ca.srl的文件存储序列号(官方是这样说的)。下次再次签署证书时就可以直接指定这个序列文件了。命令如下:openssl x509 -req -days 30 -in ../demo/server/server.csr -CA ../demo/ca/ca.crt-CAkey ../demo/ca/ca.key -CAserial ca.srl -out ../demo/server/server.crt
输入CA私钥的密码后签署成功。
7.创建server端的pkcs12文件
openssl pkcs12 -export -in ../demo/server/server.crt -inkey../demo/server/server.key -out ../demo/server/server.p12 -name demo_server
注意其中的-name demo_server,这个是指定keystore的别名,记下来,很重要哦(weblogic要用到,网上的资料都没有这个参数,害得我weblogic配置时费老了劲了)。
8.转换pkcs12为JKS keystore文件
cmd进入到java jdk的bin目录下
参考:https://www.cnblogs.com/got-my-way/p/6256306.html
keytool -importkeystore -srckeystorekeystore.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore keystore.jks
在此处输入上一步设置到export password。
Server端相关文件就完成了,现在可以用java的keytool命令查看一下生成的server.jks的内容
keytool -v -list -keystore ../demo/server/server.jks
接下来开始准备client端的相关文件,因为我们启用了数字证书的机制,client在通过webservice访问server时也需要提供自己的证书,也就是server和client相互认证(客户要求的,唉)。客户端的相关操作与server端类似,不做过多说明。
9.创建client端的私钥
openssl req -new -newkey rsa:1024 -nodes -out ../demo/client/client.req-keyout ../demo/client/client.key
10.创建client端证书签名请求
openssl x509 -CA ../demo/ca/ca.crt -CAkey ../demo/ca/ca.key -CAserial .srl -req-in ../demo/client/client.req -out ../demo/client/client.pem -days 365
11.创建client端的pkcs12文件
openssl pkcs12 -export -clcerts -in ../demo/client/client.pem -inkey../demo/client/client.key -out ../demo/client/client.p12 –name demo_client
12.创建client端的jks文件
参考上面的8步骤。
13.创建信任密钥库
这次用到java的keytool命令
keytool -genkey -alias dummy -keyalg RSA -keystore../demo/server/truststore.jks
到此为止数字证书的部分就完成了,下面介绍一下tomcat如何配置ssl支持。
14.将CA认证过的证书导入信任库
keytool -import -v-trustcacerts -alias my_ca -file ../demo/ca/ca.crt -keystore../demo/server/truststore.jks
通过下面的命令可以查看信任库的详细信息
keytool -v -list -keystore../demo/server/truststore.jks
二、发布 webservice
发布一个最简单的webservice(这里不做说明,可以参考我其他博文)
三、web容器配置
1、tomcat
把tomcat6中server.xml[z1] 中https的connector放开,配置如下
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="100"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="/conf/server.jks[z2] "
keystorePass="XXXXXX"
keystoreFile="D:\\server.jks"
keystorePass="000000"
truststoreFile="D:\\truststore.jks"
truststorePass="000000"
algorithm="SunX509"
/>
注:keystoreFile对应server端的jks文件,keystorePass对应其密码
四、测试
启动tomcat6.0,输入:https://localhost:8443/HelloWorld/services/HelloWorldService?wsdl
这里要注意端口,http下用的是80端口,而https下用的是443端口。
[z1]Tomcat的安装路径
[z2]可以写绝对路径d://server.jks或者/conf/server.jks路径在tomcat安装路径