一般我们写的javaweb网站都运行在tomcat容器中,使用的都是http协议,使用get明文传输,由于没有加密,所以整个数据的传输中,都是有可能被抓取、劫持或篡改(如中间人攻击,嗅探)。所以一些关键的服务需要用的https协议。昨天在尝试https时也遇到了一个问题,在这里就拿出来分享一下。
一、证书问题
为了做测试肯定不会专门去买一个证书,所以当然使用java的keytool自签发一个证书,在终端中输入:
生成密钥
keytool -genkey -alias ‘名称’ -keyalg RSA -keystore ‘名称’.jks -validity 3600 -storepass ‘密码’
签发证书
keytool -export -alias ‘名称’ -file ‘证书名称’.cer -keystore ‘名称’.jks -storepass ‘密码’
然后修改tomcat的conf下的server.xml,开放8443端口,并加载jks文件,
<Connectorport="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="xxx.jks" keystorePass="密码"
clientAuth="false" sslProtocol="TLS" />
这里有一点很重要,就是在生成密钥对是,第一项,即CN项,一定要写域名(如本机就填写localhost),后面信息的可以随意,因为我在局域网中测试,一开始直接写的ip,然后发现部署到tomcat上之后,即使已经给浏览器安装了签发的证书,仍然有警告,提示站点不符的错误。因此,我把CN改成了localhost,访问的时候直接在地址栏填入localhost:8443再次安装新证书之后,就不再警告了。如果使用STS这样的编译器,则应该修改和工程同目录下的Server文件夹里面tomcat的server.xml。