申请ssl证书
首先在这里感谢各位前辈大佬们的无私奉献。
因为域名是在阿里云上注册的,所以直接在上边申请了免费的ssl证书,申请过程是傻瓜式的,直接下一步就ok。申请万之后,需要等一小会儿,之后就会提示审核通过,直接点击下载按钮,弹出证书的下载列表,因为我们是JBOSS ,所以下载Tomcat 的。
如图片:
pfx 转换 jks
这块呢因为需要用到jks的证书,在网上其实也有好多转换工具,大家可以直接百度,我呢因为一开始没搞太明白,所以在网上找到一位大佬写的代码,因为忘记存书签了,这边就不贴大佬的链接了,下面直接上代码:
package com.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Enumeration;
/**
* pfx 转 jks
* @author zdgao
*
*/
public class ConventPFXToJKS {
public static final String PKCS12 = "PKCS12";
public static final String JKS = "JKS";
public static final String PFX_KEYSTORE_FILE = "E:\\temp\\certs\\cert-12.pfx";// pfx文件位置
public static final String PFX_PASSWORD = "12345";// 导出为pfx文件的设的密码
public static final String JKS_KEYSTORE_FILE = "E:\\temp\\certs\\jbosscert.jks"; // jks文件位置
public static final String JKS_PASSWORD = "12345";// JKS的密码
public static void coverTokeyStore() {
FileInputStream fis = null;
FileOutputStream out = null;
try {
KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");
fis = new FileInputStream(PFX_KEYSTORE_FILE);
char[] pfxPassword = null;
if ((PFX_PASSWORD == null) || PFX_PASSWORD.trim().equals("")) {
pfxPassword = null;
} else {
pfxPassword = PFX_PASSWORD.toCharArray();
}
char[] jksPassword = null;
if ((JKS_PASSWORD == null) || JKS_PASSWORD.trim().equals("")) {
jksPassword = null;
} else {
jksPassword = JKS_PASSWORD.toCharArray();
}
inputKeyStore.load(fis, pfxPassword);
fis.close();
KeyStore outputKeyStore = KeyStore.getInstance("JKS");
outputKeyStore.load(null, jksPassword);
Enumeration enums = inputKeyStore.aliases();
while (enums.hasMoreElements()) { // we are readin just one
// certificate.
String keyAlias = (String) enums.nextElement();
System.out.println("alias=[" + keyAlias + "]");
if (inputKeyStore.isKeyEntry(keyAlias)) {
Key key = inputKeyStore.getKey(keyAlias, pfxPassword);
Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
outputKeyStore.setKeyEntry(keyAlias, key, jksPassword, certChain);
}
}
out = new FileOutputStream(JKS_KEYSTORE_FILE);
outputKeyStore.store(out, jksPassword);
out.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
coverTokeyStore(); // pfx to jks
}
}
修改Jboss的配置文件
这段我是直接在阿里云上搜到的一个教程,给大家贴下地址: JBoss如何部署SSL证书.
大家可以去看看原文,不过我这边为了文章的完整性,下边直接都会拷贝过来,CV一下
1.确认jboss版本,建议您将SSL证书部署在JBoss 7.1.1及以上版本。
2.修改服务端口。进入JBoss主目录下的standalone/configuration,修改standalone.xml文件。
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:127.0.0.1}"></inet>
</interface>
<!--开启远程访问-->
<interface name="public">
<inet-address value="${jboss.bind.address:0.0.0.0}"></inet>
</interface>
<interface name="unsecure">
<inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"></inet>
</interface>
</interfaces>
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"></socket>
<socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"></socket>
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"></socket>
<socket-binding name="ajp" port="8009"></socket>
<!--修改http端口-->
<socket-binding name="http" port="80"></socket>
<!--修改https端口-->
<socket-binding name="https" port="443"></socket>
<socket-binding name="osgi-http" interface="management" port="8090"></socket>
<socket-binding name="remoting" port="4447"></socket>
<socket-binding name="txn-recovery-environment" port="4712"></socket>
<socket-binding name="txn-status-manager" port="4713"></socket>
<outbound-socket-binding name="mail-smtp">
<remote-destination host="localhost" port="25"></remote>
</outbound-socket-binding>
</socket-binding-group>
3.进入Jboss安装目录的bin目录下,执行standalone.sh,确保应用正常访问。
4.获取证书,并转换成jks格式。
从阿里云下载tomcat格式的证书,非系统生成的CSR需要生成pfx证书密匙对文件,解压后文件包括:
214362464370691.key
214362464370691.pem
214362464370691.pfx
pfx-password.txt .非系统生成的CSR,转换pfx的证书密匙对文件为jks格式(windows环境注意在%JAVA_HOME%/jdk/bin目录下执行)。转换示例如下:
openssl pkcs12 -export -out 214362464370691.pfx -inkey 214362464370691.key -in 214362464370691.pem
回车后输入两次要设置的JKS格式证书密码,然后输入一次PFX证书密码。三次密码必须输入pfx-password.txt记录的密码。
5.部署证书。
进入JBoss主目录下的standalone/configuration,新建cer文件,将jks格式证书放入该文件夹。
#cd /opt/jboss711/standalone/configuration
#mkdir cert
# pwd
/opt/jboss711/standalone/configuration/cert
#cp -rf /opt/keys/jboss.jks .
修改standalone.xml文件,添加证书相关配置。
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
<ssl name="https" password="214362464370691" certificate-key-file="../standalone/configuration/cert/jboss.jks" cipher-suite="TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA" protocol="TLSv1,TLSv1.1,TLSv1.2"/>
</connector>
<virtual-server name="default-host" enable-welcome-root="true">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
重启Jboss服务器。进入Jboss目录下的bin目录,执行standalone.sh脚本。
#pwd
/opt/jboss711/bin
#sh standalone.sh &
验证。
以上就是阿里云的教程,不过因为SSL是要用到微信小程序中,所以个人感觉里边有个小坑。
做完上边这些操作之后呢,大家最好做一下SSL证书的测试,这个网上也是有一大堆的,个人推荐这个: SSL证书-检测.
一开始还不错,证书检测结果都通过了,但是服务器检测没通过,我也没往深处想,直接略过。
之后在服务器上直接部署程序,把同事写好的小程序上传,先生成个体验版本。
这一下,问题就出来了,ios系统的手机表示访问毫无压力,安卓的却始终不行。这问题搞了我一天时间,也是醉了,快怀疑人生了。在安卓上报 request:fail ssl hand shake error,之后在网上各种搜索,各种尝试,都没能定位问题。
最后经过同事的细心帮助,看过另一个博客 服务器配置SSL指南.再联想到之前的检测结果,PFS(完全正向保密)错误,之后按照提示,在配置文件里,做了下边的修改:
<subsystem xmlns="urn:jboss:domain:web:2.1" default-virtual-server="default-host" native="false">
<configuration>
<jsp-configuration development="true"/>
</configuration>
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
<ssl name="https" password="12345" certificate-key-file="../standalone/configuration/jbosscert.jks" cipher-suite="ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4" protocol="TLSv1,TLSv1.1,TLSv1.2"/>
</connector>
<virtual-server enable-welcome-root="false" name="default-host">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
</connector>
做完这些之后,重新进行了一下SSL的检测,下边是我最后的检测结果
检测之后重启JBOSS服务,手机测试,ok。完美!!!