- 浏览: 4399716 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (163)
- 职场 && 心情 (22)
- Java/Basic (17)
- Java/Compression (7)
- Java/Security (20)
- Java/Maven (3)
- Java/Cache (11)
- Eclipse (4)
- Spring (19)
- ORM/Hibernate (2)
- ORM/iBatis (3)
- DB/NoSQL (11)
- DB/MySQL (7)
- DB/MS SQL Server (4)
- OS/Linux (11)
- OS/Mac (7)
- C/C++ (4)
- Server Architecture/Basic (13)
- Server Architecture/Distributed (17)
- Moblie/Andriod (2)
- WebService (3)
- Objective-C (1)
- Html (1)
- 设计模式 (1)
- Scala (0)
- Kafka (1)
最新评论
-
w47_csdn:
证书安装:在"浏览"选项中选择" ...
Java加密技术(九)——初探SSL -
w47_csdn:
<div class="quote_title ...
Java加密技术(九)——初探SSL -
liuyachao111:
11楼说的对 用@ControllerAdvicepublic ...
Spring 注解学习手札(八)补遗——@ExceptionHandler -
irayslu:
作者你好, 我把你的源码放在jdk6, jdk7 中运行正常, ...
Java加密技术(五)——非对称加密算法的由来DH -
夏季浅忆-卖小子:
为什么不能解压rar格式的压缩包呢
Java压缩技术(三) ZIP解压缩——Java原生实现
在Java加密技术(八)中,我们模拟了一个基于RSA非对称加密网络的安全通信。现在我们深度了解一下现有的安全网络通信——SSL。
我们需要构建一个由CA机构签发的有效证书,这里我们使用上文中生成的自签名证书zlex.cer
这里,我们将证书导入到我们的密钥库。
其中
-import表示导入
-alias指定别名,这里是www.zlex.org
-file指定算法,这里是d:/zlex.cer
-keystore指定存储位置,这里是d:/zlex.keystore
在这里我使用的密码为654321
控制台输出:
OK,最复杂的准备工作已经完成。
接下来我们将域名www.zlex.org定位到本机上。打开C:\Windows\System32\drivers\etc\hosts文件,将www.zlex.org绑定在本机上。在文件末尾追加127.0.0.1 www.zlex.org。现在通过地址栏访问http://www.zlex.org,或者通过ping命令,如果能够定位到本机,域名映射就搞定了。
现在,配置tomcat。先将zlex.keystore拷贝到tomcat的conf目录下,然后配置server.xml。将如下内容加入配置文件
注意clientAuth="false"测试阶段,置为false,正式使用时建议使用true。现在启动tomcat,访问https://www.zlex.org/。
显然,证书未能通过认证,这个时候你可以选择安装证书(上文中的zlex.cer文件就是证书),作为受信任的根证书颁发机构导入,再次重启浏览器(IE,其他浏览器对于域名www.zlex.org不支持本地方式访问),访问https://www.zlex.org/,你会看到地址栏中会有个小锁,就说明安装成功。所有的浏览器联网操作已经在RSA加密解密系统的保护之下了。但似乎我们感受不到。
这个时候很多人开始怀疑,如果我们要手工做一个这样的https的访问是不是需要把浏览器的这些个功能都实现呢?不需要!
接着上篇内容,给出如下代码实现:
增加了configSSLSocketFactory方法供外界调用,该方法为HttpsURLConnection配置了SSLSocketFactory。当HttpsURLConnection配置了SSLSocketFactory后,我们就可以通过HttpsURLConnection的getInputStream、getOutputStream,像往常使用HttpURLConnection做操作了。尤其要说明一点,未配置SSLSocketFactory前,HttpsURLConnection的getContentLength()获得值永远都是-1。
给出相应测试类:
注意testHttps方法,几乎和我们往常做HTTP访问没有差别,我们来看控制台输出:
通过浏览器直接访问https://www.zlex.org/examples/你也会获得上述内容。也就是说应用甲方作为服务器构建tomcat服务,乙方可以通过上述方式访问甲方受保护的SSL应用,并且不需要考虑具体的加密解密问题。甲乙双方可以经过相应配置,通过双方的tomcat配置有效的SSL服务,简化上述代码实现,完全通过证书配置完成SSL双向认证!
相关链接:
Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC
Java加密技术(二)——对称加密DES&AES
Java加密技术(三)——PBE算法
Java加密技术(四)——非对称加密算法RSA
Java加密技术(五)——非对称加密算法的由来
Java加密技术(六)——数字签名算法DSA
Java加密技术(七)——非对称加密算法最高ECC
Java加密技术(八)——数字证书
Java加密技术(九)——初探SSL
Java加密技术(十)——单向认证
Java加密技术(十一)——双向认证
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
博主的tomcat配置有问题,使用以下即可:
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"
keystoreFile="d:\bo.keystore" keystorePass="123456" />
同问 请问你现在知道了么?
执行删除命令就可以了,类似:
keytool -delete -alias www.ef.org -keystore ef.keystore -storepass 123456
然后再导入就可以了,类似:
keytool -importcert -trustcacerts -alias www.ef.org -file ef.cer -keystore ef.keystore -storepass 123456
我也遇到这个问题了,如何解决啊?求解
不要求做客户端证书验证。
我们需要构建一个由CA机构签发的有效证书,这里我们使用上文中生成的自签名证书zlex.cer
这里,我们将证书导入到我们的密钥库。
keytool -import -alias www.zlex.org -file d:/zlex.cer -keystore d:/zlex.keystore
其中
-import表示导入
-alias指定别名,这里是www.zlex.org
-file指定算法,这里是d:/zlex.cer
-keystore指定存储位置,这里是d:/zlex.keystore
在这里我使用的密码为654321
控制台输出:
输入keystore密码: 再次输入新密码: 所有者:CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN 签发人:CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN 序列号:4a1e48df 有效期: Thu May 28 16:18:39 CST 2009 至Wed Aug 26 16:18:39 CST 2009 证书指纹: MD5:19:CA:E6:36:E2:DF:AD:96:31:97:2F:A9:AD:FC:37:6A SHA1:49:88:30:59:29:45:F1:69:CA:97:A9:6D:8A:CF:08:D2:C3:D5:C0:C4 签名算法名称:SHA1withRSA 版本: 3 信任这个认证? [否]: y 认证已添加至keystore中
OK,最复杂的准备工作已经完成。
接下来我们将域名www.zlex.org定位到本机上。打开C:\Windows\System32\drivers\etc\hosts文件,将www.zlex.org绑定在本机上。在文件末尾追加127.0.0.1 www.zlex.org。现在通过地址栏访问http://www.zlex.org,或者通过ping命令,如果能够定位到本机,域名映射就搞定了。
现在,配置tomcat。先将zlex.keystore拷贝到tomcat的conf目录下,然后配置server.xml。将如下内容加入配置文件
<Connector SSLEnabled="true" URIEncoding="UTF-8" clientAuth="false" keystoreFile="conf/zlex.keystore" keystorePass="123456" maxThreads="150" port="443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS" />
注意clientAuth="false"测试阶段,置为false,正式使用时建议使用true。现在启动tomcat,访问https://www.zlex.org/。
显然,证书未能通过认证,这个时候你可以选择安装证书(上文中的zlex.cer文件就是证书),作为受信任的根证书颁发机构导入,再次重启浏览器(IE,其他浏览器对于域名www.zlex.org不支持本地方式访问),访问https://www.zlex.org/,你会看到地址栏中会有个小锁,就说明安装成功。所有的浏览器联网操作已经在RSA加密解密系统的保护之下了。但似乎我们感受不到。
这个时候很多人开始怀疑,如果我们要手工做一个这样的https的访问是不是需要把浏览器的这些个功能都实现呢?不需要!
接着上篇内容,给出如下代码实现:
import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Date; import javax.crypto.Cipher; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory; /** * 证书组件 * * @author 梁栋 * @version 1.0 * @since 1.0 */ public abstract class CertificateCoder extends Coder { /** * Java密钥库(Java Key Store,JKS)KEY_STORE */ public static final String KEY_STORE = "JKS"; public static final String X509 = "X.509"; public static final String SunX509 = "SunX509"; public static final String SSL = "SSL"; /** * 由KeyStore获得私钥 * * @param keyStorePath * @param alias * @param password * @return * @throws Exception */ private static PrivateKey getPrivateKey(String keyStorePath, String alias, String password) throws Exception { KeyStore ks = getKeyStore(keyStorePath, password); PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray()); return key; } /** * 由Certificate获得公钥 * * @param certificatePath * @return * @throws Exception */ private static PublicKey getPublicKey(String certificatePath) throws Exception { Certificate certificate = getCertificate(certificatePath); PublicKey key = certificate.getPublicKey(); return key; } /** * 获得Certificate * * @param certificatePath * @return * @throws Exception */ private static Certificate getCertificate(String certificatePath) throws Exception { CertificateFactory certificateFactory = CertificateFactory .getInstance(X509); FileInputStream in = new FileInputStream(certificatePath); Certificate certificate = certificateFactory.generateCertificate(in); in.close(); return certificate; } /** * 获得Certificate * * @param keyStorePath * @param alias * @param password * @return * @throws Exception */ private static Certificate getCertificate(String keyStorePath, String alias, String password) throws Exception { KeyStore ks = getKeyStore(keyStorePath, password); Certificate certificate = ks.getCertificate(alias); return certificate; } /** * 获得KeyStore * * @param keyStorePath * @param password * @return * @throws Exception */ private static KeyStore getKeyStore(String keyStorePath, String password) throws Exception { FileInputStream is = new FileInputStream(keyStorePath); KeyStore ks = KeyStore.getInstance(KEY_STORE); ks.load(is, password.toCharArray()); is.close(); return ks; } /** * 私钥加密 * * @param data * @param keyStorePath * @param alias * @param password * @return * @throws Exception */ public static byte[] encryptByPrivateKey(byte[] data, String keyStorePath, String alias, String password) throws Exception { // 取得私钥 PrivateKey privateKey = getPrivateKey(keyStorePath, alias, password); // 对数据加密 Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); return cipher.doFinal(data); } /** * 私钥解密 * * @param data * @param keyStorePath * @param alias * @param password * @return * @throws Exception */ public static byte[] decryptByPrivateKey(byte[] data, String keyStorePath, String alias, String password) throws Exception { // 取得私钥 PrivateKey privateKey = getPrivateKey(keyStorePath, alias, password); // 对数据加密 Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(data); } /** * 公钥加密 * * @param data * @param certificatePath * @return * @throws Exception */ public static byte[] encryptByPublicKey(byte[] data, String certificatePath) throws Exception { // 取得公钥 PublicKey publicKey = getPublicKey(certificatePath); // 对数据加密 Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data); } /** * 公钥解密 * * @param data * @param certificatePath * @return * @throws Exception */ public static byte[] decryptByPublicKey(byte[] data, String certificatePath) throws Exception { // 取得公钥 PublicKey publicKey = getPublicKey(certificatePath); // 对数据加密 Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publicKey); return cipher.doFinal(data); } /** * 验证Certificate * * @param certificatePath * @return */ public static boolean verifyCertificate(String certificatePath) { return verifyCertificate(new Date(), certificatePath); } /** * 验证Certificate是否过期或无效 * * @param date * @param certificatePath * @return */ public static boolean verifyCertificate(Date date, String certificatePath) { boolean status = true; try { // 取得证书 Certificate certificate = getCertificate(certificatePath); // 验证证书是否过期或无效 status = verifyCertificate(date, certificate); } catch (Exception e) { status = false; } return status; } /** * 验证证书是否过期或无效 * * @param date * @param certificate * @return */ private static boolean verifyCertificate(Date date, Certificate certificate) { boolean status = true; try { X509Certificate x509Certificate = (X509Certificate) certificate; x509Certificate.checkValidity(date); } catch (Exception e) { status = false; } return status; } /** * 签名 * * @param keyStorePath * @param alias * @param password * * @return * @throws Exception */ public static String sign(byte[] sign, String keyStorePath, String alias, String password) throws Exception { // 获得证书 X509Certificate x509Certificate = (X509Certificate) getCertificate( keyStorePath, alias, password); // 获取私钥 KeyStore ks = getKeyStore(keyStorePath, password); // 取得私钥 PrivateKey privateKey = (PrivateKey) ks.getKey(alias, password .toCharArray()); // 构建签名 Signature signature = Signature.getInstance(x509Certificate .getSigAlgName()); signature.initSign(privateKey); signature.update(sign); return encryptBASE64(signature.sign()); } /** * 验证签名 * * @param data * @param sign * @param certificatePath * @return * @throws Exception */ public static boolean verify(byte[] data, String sign, String certificatePath) throws Exception { // 获得证书 X509Certificate x509Certificate = (X509Certificate) getCertificate(certificatePath); // 获得公钥 PublicKey publicKey = x509Certificate.getPublicKey(); // 构建签名 Signature signature = Signature.getInstance(x509Certificate .getSigAlgName()); signature.initVerify(publicKey); signature.update(data); return signature.verify(decryptBASE64(sign)); } /** * 验证Certificate * * @param keyStorePath * @param alias * @param password * @return */ public static boolean verifyCertificate(Date date, String keyStorePath, String alias, String password) { boolean status = true; try { Certificate certificate = getCertificate(keyStorePath, alias, password); status = verifyCertificate(date, certificate); } catch (Exception e) { status = false; } return status; } /** * 验证Certificate * * @param keyStorePath * @param alias * @param password * @return */ public static boolean verifyCertificate(String keyStorePath, String alias, String password) { return verifyCertificate(new Date(), keyStorePath, alias, password); } /** * 获得SSLSocektFactory * * @param password * 密码 * @param keyStorePath * 密钥库路径 * * @param trustKeyStorePath * 信任库路径 * @return * @throws Exception */ private static SSLSocketFactory getSSLSocketFactory(String password, String keyStorePath, String trustKeyStorePath) throws Exception { // 初始化密钥库 KeyManagerFactory keyManagerFactory = KeyManagerFactory .getInstance(SunX509); KeyStore keyStore = getKeyStore(keyStorePath, password); keyManagerFactory.init(keyStore, password.toCharArray()); // 初始化信任库 TrustManagerFactory trustManagerFactory = TrustManagerFactory .getInstance(SunX509); KeyStore trustkeyStore = getKeyStore(trustKeyStorePath, password); trustManagerFactory.init(trustkeyStore); // 初始化SSL上下文 SSLContext ctx = SSLContext.getInstance(SSL); ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory .getTrustManagers(), null); SSLSocketFactory sf = ctx.getSocketFactory(); return sf; } /** * 为HttpsURLConnection配置SSLSocketFactory * * @param conn * HttpsURLConnection * @param password * 密码 * @param keyStorePath * 密钥库路径 * * @param trustKeyStorePath * 信任库路径 * @throws Exception */ public static void configSSLSocketFactory(HttpsURLConnection conn, String password, String keyStorePath, String trustKeyStorePath) throws Exception { conn.setSSLSocketFactory(getSSLSocketFactory(password, keyStorePath, trustKeyStorePath)); } }
增加了configSSLSocketFactory方法供外界调用,该方法为HttpsURLConnection配置了SSLSocketFactory。当HttpsURLConnection配置了SSLSocketFactory后,我们就可以通过HttpsURLConnection的getInputStream、getOutputStream,像往常使用HttpURLConnection做操作了。尤其要说明一点,未配置SSLSocketFactory前,HttpsURLConnection的getContentLength()获得值永远都是-1。
给出相应测试类:
import static org.junit.Assert.*; import java.io.DataInputStream; import java.io.InputStream; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import org.junit.Test; /** * * @author 梁栋 * @version 1.0 * @since 1.0 */ public class CertificateCoderTest { private String password = "123456"; private String alias = "www.zlex.org"; private String certificatePath = "d:/zlex.cer"; private String keyStorePath = "d:/zlex.keystore"; private String clientKeyStorePath = "d:/zlex-client.keystore"; private String clientPassword = "654321"; @Test public void test() throws Exception { System.err.println("公钥加密——私钥解密"); String inputStr = "Ceritifcate"; byte[] data = inputStr.getBytes(); byte[] encrypt = CertificateCoder.encryptByPublicKey(data, certificatePath); byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt, keyStorePath, alias, password); String outputStr = new String(decrypt); System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr); // 验证数据一致 assertArrayEquals(data, decrypt); // 验证证书有效 assertTrue(CertificateCoder.verifyCertificate(certificatePath)); } @Test public void testSign() throws Exception { System.err.println("私钥加密——公钥解密"); String inputStr = "sign"; byte[] data = inputStr.getBytes(); byte[] encodedData = CertificateCoder.encryptByPrivateKey(data, keyStorePath, alias, password); byte[] decodedData = CertificateCoder.decryptByPublicKey(encodedData, certificatePath); String outputStr = new String(decodedData); System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr); assertEquals(inputStr, outputStr); System.err.println("私钥签名——公钥验证签名"); // 产生签名 String sign = CertificateCoder.sign(encodedData, keyStorePath, alias, password); System.err.println("签名:\r" + sign); // 验证签名 boolean status = CertificateCoder.verify(encodedData, sign, certificatePath); System.err.println("状态:\r" + status); assertTrue(status); } @Test public void testHttps() throws Exception { URL url = new URL("https://www.zlex.org/examples/"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); CertificateCoder.configSSLSocketFactory(conn, clientPassword, clientKeyStorePath, clientKeyStorePath); InputStream is = conn.getInputStream(); int length = conn.getContentLength(); DataInputStream dis = new DataInputStream(is); byte[] data = new byte[length]; dis.readFully(data); dis.close(); System.err.println(new String(data)); conn.disconnect(); } }
注意testHttps方法,几乎和我们往常做HTTP访问没有差别,我们来看控制台输出:
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>Apache Tomcat Examples</TITLE> <META http-equiv=Content-Type content="text/html"> </HEAD> <BODY> <P> <H3>Apache Tomcat Examples</H3> <P></P> <ul> <li><a href="servlets">Servlets examples</a></li> <li><a href="jsp">JSP Examples</a></li> </ul> </BODY></HTML>
通过浏览器直接访问https://www.zlex.org/examples/你也会获得上述内容。也就是说应用甲方作为服务器构建tomcat服务,乙方可以通过上述方式访问甲方受保护的SSL应用,并且不需要考虑具体的加密解密问题。甲乙双方可以经过相应配置,通过双方的tomcat配置有效的SSL服务,简化上述代码实现,完全通过证书配置完成SSL双向认证!
相关链接:
Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC
Java加密技术(二)——对称加密DES&AES
Java加密技术(三)——PBE算法
Java加密技术(四)——非对称加密算法RSA
Java加密技术(五)——非对称加密算法的由来
Java加密技术(六)——数字签名算法DSA
Java加密技术(七)——非对称加密算法最高ECC
Java加密技术(八)——数字证书
Java加密技术(九)——初探SSL
Java加密技术(十)——单向认证
Java加密技术(十一)——双向认证
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
评论
18 楼
w47_csdn
2019-02-14
证书安装:在"浏览"选项中选择"受信任的根证书颁发机构"导入,再次访问时就不会提示证书不受信。
17 楼
w47_csdn
2019-02-14
spiritfrog 写道
你好,我按照你的步骤,tomcat中增加了
<Connector
SSLEnabled="true"
URIEncoding="UTF-8"
clientAuth="false"
keystoreFile="conf/zlex.keystore"
keystorePass="123456"
maxThreads="150"
port="443"
protocol="HTTP/1.1"
scheme="https"
secure="true"
sslProtocol="TLS" />
但启动tomcat就报错了:
严重: Catalina.start:
LifecycleException: service.getName(): "Catalina"; Protocol handler start fail
ed: java.io.IOException: SSL configuration is invalid due to No available certif
icate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.catalina.connector.Connector.start(Connector.java:1097)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
57)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2010-2-26 16:01:20 org.apache.catalina.startup.Catalina start
请问这是怎么弄呢?
<Connector
SSLEnabled="true"
URIEncoding="UTF-8"
clientAuth="false"
keystoreFile="conf/zlex.keystore"
keystorePass="123456"
maxThreads="150"
port="443"
protocol="HTTP/1.1"
scheme="https"
secure="true"
sslProtocol="TLS" />
但启动tomcat就报错了:
严重: Catalina.start:
LifecycleException: service.getName(): "Catalina"; Protocol handler start fail
ed: java.io.IOException: SSL configuration is invalid due to No available certif
icate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.catalina.connector.Connector.start(Connector.java:1097)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
57)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2010-2-26 16:01:20 org.apache.catalina.startup.Catalina start
请问这是怎么弄呢?
博主的tomcat配置有问题,使用以下即可:
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"
keystoreFile="d:\bo.keystore" keystorePass="123456" />
16 楼
wang_he_all_5200
2016-03-23
ak23173969 写道
楼主,我这边出现两个个问题
具体情况是
第一个是 我配置tomact后,浏览器并没有看到什么变化,我这边的证书状态是不受信任的
第二个就是 测试类中的出现了clientKeyStorePath 文件的路径,但是之前并没有出现该文件啊
楼主要是有时间看到的话,请帮忙解答下
谢谢
具体情况是
第一个是 我配置tomact后,浏览器并没有看到什么变化,我这边的证书状态是不受信任的
第二个就是 测试类中的出现了clientKeyStorePath 文件的路径,但是之前并没有出现该文件啊
楼主要是有时间看到的话,请帮忙解答下
谢谢
同问 请问你现在知道了么?
15 楼
llcc1
2016-01-21
keytool -import -alias www.zlex.org -file d:/zlex.cer -keystore d:/zlex.keystore
将cer导入到keystore的作用是什么呢,直接用d:/zlex.keystore就可以了吧
将cer导入到keystore的作用是什么呢,直接用d:/zlex.keystore就可以了吧
14 楼
dunhanson
2015-02-24
感谢博主的文章,总算是对RSA加密技术有所了解。项目上要用到,正在试验当中
13 楼
hanbaojun2013
2014-06-27
Tomcat SSL configuration issue - java.io.IOException: jsse.invalid_ssl_conf
zl 报这个错,我是完全按照你的这个写的是什么情况,谢谢
zl 报这个错,我是完全按照你的这个写的是什么情况,谢谢
12 楼
wjt9989
2014-03-06
执行删除命令就可以了,类似:
keytool -delete -alias www.ef.org -keystore ef.keystore -storepass 123456
然后再导入就可以了,类似:
keytool -importcert -trustcacerts -alias www.ef.org -file ef.cer -keystore ef.keystore -storepass 123456
vinegardou 写道
我也出现了
认证回复与keystore中的认证是相同的
怎么解决这个问题呢?
认证回复与keystore中的认证是相同的
怎么解决这个问题呢?
11 楼
vinegardou
2013-10-11
我也出现了
认证回复与keystore中的认证是相同的
怎么解决这个问题呢?
认证回复与keystore中的认证是相同的
怎么解决这个问题呢?
10 楼
ak23173969
2013-09-30
楼主,我这边出现两个个问题
具体情况是
第一个是 我配置tomact后,浏览器并没有看到什么变化,我这边的证书状态是不受信任的
第二个就是 测试类中的出现了clientKeyStorePath 文件的路径,但是之前并没有出现该文件啊
楼主要是有时间看到的话,请帮忙解答下
谢谢
具体情况是
第一个是 我配置tomact后,浏览器并没有看到什么变化,我这边的证书状态是不受信任的
第二个就是 测试类中的出现了clientKeyStorePath 文件的路径,但是之前并没有出现该文件啊
楼主要是有时间看到的话,请帮忙解答下
谢谢
9 楼
愤怒的程序猿
2013-08-12
LZ:keytool错误:java.lang.Exception:认证回复与keystore中的认证是相同的.这个错误如何解决呢?
8 楼
gwh_08
2013-01-23
spiritfrog 写道
你好,我按照你的步骤,tomcat中增加了
<Connector
SSLEnabled="true"
URIEncoding="UTF-8"
clientAuth="false"
keystoreFile="conf/zlex.keystore"
keystorePass="123456"
maxThreads="150"
port="443"
protocol="HTTP/1.1"
scheme="https"
secure="true"
sslProtocol="TLS" />
但启动tomcat就报错了:
严重: Catalina.start:
LifecycleException: service.getName(): "Catalina"; Protocol handler start fail
ed: java.io.IOException: SSL configuration is invalid due to No available certif
icate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.catalina.connector.Connector.start(Connector.java:1097)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
57)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2010-2-26 16:01:20 org.apache.catalina.startup.Catalina start
请问这是怎么弄呢?
<Connector
SSLEnabled="true"
URIEncoding="UTF-8"
clientAuth="false"
keystoreFile="conf/zlex.keystore"
keystorePass="123456"
maxThreads="150"
port="443"
protocol="HTTP/1.1"
scheme="https"
secure="true"
sslProtocol="TLS" />
但启动tomcat就报错了:
严重: Catalina.start:
LifecycleException: service.getName(): "Catalina"; Protocol handler start fail
ed: java.io.IOException: SSL configuration is invalid due to No available certif
icate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.catalina.connector.Connector.start(Connector.java:1097)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
57)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2010-2-26 16:01:20 org.apache.catalina.startup.Catalina start
请问这是怎么弄呢?
我也遇到这个问题了,如何解决啊?求解
7 楼
chl19871024
2010-03-02
认证回复与keystore中的认证是相同的? 这是什么错误。。
6 楼
spiritfrog
2010-02-26
刚把域名换成了localhost,重新生成keystore和cer,就可以了。
谢谢。
但不清楚
CertificateCoder.configSSLSocketFactory(conn, clientPassword,
clientKeyStorePath, clientKeyStorePath);
里面的clientKeyStorePath是什么意思。。
谢谢。
但不清楚
CertificateCoder.configSSLSocketFactory(conn, clientPassword,
clientKeyStorePath, clientKeyStorePath);
里面的clientKeyStorePath是什么意思。。
5 楼
spiritfrog
2010-02-26
你好,我按照你的步骤,tomcat中增加了
<Connector
SSLEnabled="true"
URIEncoding="UTF-8"
clientAuth="false"
keystoreFile="conf/zlex.keystore"
keystorePass="123456"
maxThreads="150"
port="443"
protocol="HTTP/1.1"
scheme="https"
secure="true"
sslProtocol="TLS" />
但启动tomcat就报错了:
严重: Catalina.start:
LifecycleException: service.getName(): "Catalina"; Protocol handler start fail
ed: java.io.IOException: SSL configuration is invalid due to No available certif
icate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.catalina.connector.Connector.start(Connector.java:1097)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
57)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2010-2-26 16:01:20 org.apache.catalina.startup.Catalina start
请问这是怎么弄呢?
<Connector
SSLEnabled="true"
URIEncoding="UTF-8"
clientAuth="false"
keystoreFile="conf/zlex.keystore"
keystorePass="123456"
maxThreads="150"
port="443"
protocol="HTTP/1.1"
scheme="https"
secure="true"
sslProtocol="TLS" />
但启动tomcat就报错了:
严重: Catalina.start:
LifecycleException: service.getName(): "Catalina"; Protocol handler start fail
ed: java.io.IOException: SSL configuration is invalid due to No available certif
icate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.catalina.connector.Connector.start(Connector.java:1097)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
57)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700
)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2010-2-26 16:01:20 org.apache.catalina.startup.Catalina start
请问这是怎么弄呢?
4 楼
snowolf
2009-12-09
angi0003 写道
请问clientAuth="false"是什么意思?
不要求做客户端证书验证。
3 楼
angi0003
2009-12-08
请问clientAuth="false"是什么意思?
2 楼
treblesoftware
2009-05-30
支持一下Lz,大概的看了一下,写的很漂亮!
1 楼
yinishao
2009-05-28
LZ,你太厉害了!!! 你脑袋里装了多少东西啊?!
发表评论
-
SSLSocket获取数字证书
2013-06-05 17:53 0SSLSocket直接获得数字证书 package ... -
Java加密技术(十三)——由PEM文件获取密钥
2012-07-20 17:57 0密钥库文件通常是PEM格式,这一般是由OpenSSL生成。与J ... -
《Java加密与解密的艺术》重印,销往台湾!
2010-12-03 09:34 4780感谢大家对于《Java加密与解密的艺术》一直依赖的关注! ... -
Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
2010-08-12 11:17 38389今天来点实际工作中的硬通货! 与计费系统打交道,少不了用到加密 ... -
Jasig CAS使用手札——一、了解Jasig CAS,简单运行!
2010-08-10 17:13 31455SSO : 单点登录(Single S ... -
《Java加密与解密的艺术》——配书源代码提供下载
2010-08-04 17:37 9776《Java加密与解密的艺术》上市小半年了,有不少朋友通过Jav ... -
Security证书相关文件格式汇总及其格式转换工具介绍
2010-06-10 17:58 0前段时间利用数字证书对几种语言(Java、.Net、Php) ... -
PKI常见证书格式和转换
2010-06-10 17:11 0PKCS 全称是 Public-Key Cryptograph ... -
《Java加密与解密的艺术》——迷你版提供下载
2010-06-03 23:57 8469《Java加密与解密的艺术》上市已2个月,有很多博友向我索要《 ... -
pkf<---->jks
2010-06-02 18:00 0/** * 从PKCS12格式转换为JKS格式 ... -
keytool建立双向认证
2010-06-02 15:18 0echo off echo 构建目录 mkdir ... -
关于Java企业级应用开发中的安全知识的探讨
2010-05-04 13:33 4090相信绝大多数做Java的朋友或多或少都会接触到Java安全技术 ... -
我与《Java加密与解密的艺术》——从写博客到写书
2010-04-29 16:07 8789时间飞快,《Java加密与解密的艺术》上市快有一个月了,虽然具 ... -
配置PKCS#11
2010-04-21 18:24 0配置PKCS#11(初学者) [ ... -
《Java加密与解密的艺术》本周上市,样书免费送!
2010-03-31 16:04 4997“千呼万唤使出来”——《Java加密与解密的艺术》终于要在本周 ... -
《Java加密与解密的艺术》封面已定,即将上市!
2010-03-15 22:15 6170经过一周多的反复审核,《Java加密与解密的艺术》封面终于敲定 ... -
《Java加密与解密的艺术》即将上市!
2010-03-01 09:47 7483不曾想,我的博客《Java ... -
Java加密技术(十一)——双向认证
2009-11-05 23:06 38828对于双向认证,做一个简单的描述。 服务器端下发证书,客户端接受 ... -
OSI安全体系结构
2009-06-10 18:41 5792最近研究安全技术,终 ... -
Java加密技术(十)——单向认证
2009-05-29 17:52 27669在Java 加密技术(九)中,我们使用自签名证书完成了 ...
相关推荐
title: java8 初探——interface defaultdate: 2015-12-08 00:00:02 #发表日期,一般不改动categorie
### Java加密技术详解 #### 一、BASE64与单向加密算法MD5&SHA&MAC ##### BASE64 BASE64是一种编码格式,并非真正的加密算法。它主要用于将二进制数据转换成文本格式的数据,以便在网络上传输。由于某些传输协议只...
1. **沉浸式体验技术**:XR(扩展现实)是元宇宙的核心技术之一,包括AR(增强现实)、VR(虚拟现实)和MR(混合现实)。这些技术利用先进的显示设备、传感器和追踪系统,使用户能够沉浸在三维虚拟环境中,与之互动...
计算机网络通信安全是当前互联网时代非常重要的一个领域,其中数据加密技术扮演着关键角色。文章首先探讨了数据加密技术的应用方向,包括维护网络系统安全、保障信息数据安全以及推动电商等领域的发展。这些方向充分...
在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引...随着技术的不断发展和Java社区的持续壮大,Java编程语言在未来的软件开发中仍将展现出其不可替代的光芒。
FLASH动画——电脑动画初探.pdf
项目教学法在java教学中的应用初探.pdf
Java语言课程教学方法初探.pdf
"计算机软件开发中Java编程语言的应用初探" 计算机软件开发中Java编程语言的应用初探是计算机软件开发的重要组成部分,Java编程语言是一种广泛使用的编程语言,具有许多优点和特征,使其在软件开发中应用非常广泛。...
普通高中人工智能教学策略初探——基于人脸识别的“人工智能初步”模块教学设计 人工智能是当前最热门的技术之一,对于普通高中学生来说,学习人工智能可以帮助他们更好地适应未来技术的发展。普通高中人工智能教学...
Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。...
数据加密技术作为保护网络通信安全的核心手段,其作用不可忽视。本文将深入探讨数据加密技术在计算机网络通信中的应用及其重要性。 首先,我们要理解计算机网络通信的基本概念。计算机网络是指通过物理链路将多台...
【标题】高职电子信息类专业群建设初探——以湖南铁道职业技术学院为例 【摘要】专业建设是高职教育人才培养的核心,本文以湖南铁道职业技术学院的电子信息专业群建设为例,探讨了在当前高质量技术技能型人才培养...
第三章——初探Opencv 第四章——细说HighGUI 第五章——图像处理 第六章——图像变换 第七章——直方图与匹配 第八章——轮廓 第九章——图像局部与分割 第十章——跟踪与运动 第十一章——摄像机模型与标定 第十二...
《基于SPOC的在线课程教学模式设计初探——以《Java程序设计》为例》这篇文档,探讨了在信息技术日益发达的今天,如何利用SPOC(Small Private Online Course,小规模限制性在线课程)模式优化《Java程序设计》的...
在《Java在线开放课程建设初探》一文中,作者袁利永和苗春雨探讨了Java在线开放课程建设的意义、主要内容以及在建设过程中遇到的问题。本文的重点内容可以归纳为以下几个方面: 1. Java在线开放课程建设的意义: ...
此外,Java的加密库(如Java Cryptography Extension, JCE)提供了强大的加密功能,保证了数据的安全传输和存储。 在移动开发领域,Android操作系统大量使用Java作为开发语言。通过Android Studio和相关的SDK,...
【新媒体环境下的信息系统与Java技术】\n\n随着信息化社会的深入发展,人们越来越依赖信息系统进行日常工作。2005年以后,中国进入新媒体时代,信息传播的方式发生了根本性变化,个体成为信息传播的主体,这加速了...