Tomcat openSSL自定义签名证书生成与部署

参考

http://www.cnblogs.com/tyjsjl/p/3359255.html

生成CA签名证书keystore

keytool -genkey -alias ca_server -keyalg RSA -keystore ca_server.jks -validity 3600 -storepass 123456 您的名字与姓氏是什么?  [Unknown]:   您的组织单位名称是什么?  [Unknown]:  itian 您的组织名称是什么?  [Unknown]:  itian您所在的城市或区域名称是什么?  [Unknown]:  北京 您所在的省/市/自治区名称是什么?  [Unknown]:  海淀 该单位的双字母国家/地区代码是什么?  [Unknown]:  cn CN=zhang, OU=zhang, O=zhang, L=xian, ST=shanxi, C=cn是否正确?  [否]:  y 输入 <zhy_server> 的密钥口令    (如果和密钥库口令相同, 按回车):  

然后生成cer证书

keytool -export -alias ca_server  -file zhy_server.cer -keystore ca_server.jks -storepass 123456

然后部署

<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
	    disableUploadTimeout="true" 
	    enableLookups="true" 
	    keystoreFile="D:/Tomcat/conf/CA/twt_server.jks" 
	    keystorePass="123456" 
	    maxSpareThreads="75" 
	    maxThreads="200" 
	    minSpareThreads="5" 
	    port="8848" 
	    protocol="org.apache.coyote.http11.Http11NioProtocol" 
	    scheme="https" 
	    secure="true" 
	    sslProtocol="TLS"
	    />

这样访问,通过相应的url,如????https就能访问了.

对于双向认证,我们同样需要生成客户端的cer和keystore,生成方式和上面相同,但信息不一定相同,假设我们生成了

ca_client.jks和ca_client.cer,但是cer需要特殊处理,命令如下

keytool -import -alias ca_client -file ca_client.cer -keystore ca_client_for_sever.jks

此时配置修改如下

<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
	    disableUploadTimeout="true" 
	    enableLookups="true" 
	    keystoreFile="D:/Tomcat/conf/CA/twt_server.jks" 
	    keystorePass="123456" 
	    maxSpareThreads="75" 
	    maxThreads="200" 
	    minSpareThreads="5" 
	    port="8848" 
	    protocol="org.apache.coyote.http11.Http11NioProtocol" 
	    scheme="https" 
	    secure="true" 
	    sslProtocol="TLS"
	    clientAuth="true"
            truststoreFile="D:/Tomcat/conf/CA/ca_client_for_sever.jks" 
	    />

双向认证,以Android为例子,Android只识别bks,因此需要通过相应的工具将其转为bks

public void setCertificates(InputStream... certificates)
{    try
    {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null);        int index = 0;        for (InputStream certificate : certificates)
        {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));            try
            {                if (certificate != null)
                    certificate.close();
            } catch (IOException e)
            {
            }
        }

        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.
                getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);        //初始化keystore
        KeyStore clientKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        clientKeyStore.load(mContext.getAssets().open("ca_client.bks"), "123456".toCharArray());

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(clientKeyStore, "123456".toCharArray());

        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
        
       HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
                     
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        
        @Override
        public boolean verify(String hostname, SSLSession sslsession) {
       
        if("localhost".equals(hostname)){  
            return true;  
        } else {  
            return false;  
        }  
      }
  });

    } catch (Exception e)
    {
        e.printStackTrace();
    } 

}

读取cer证书

CertificateFactory certificatefactory = CertificateFactory
				.getInstance("X.509");
		FileInputStream bais = new FileInputStream("srca.cer");
		X509Certificate Cert = (X509Certificate) certificatefactory
				.generateCertificate(bais);
		bais.close();
		System.out.println("版本号 " + Cert.getVersion());
		System.out.println("序列号 " + Cert.getSerialNumber().toString(16));
		System.out.println("全名 " + Cert.getSubjectDN());
		System.out.println("签发者全名n" + Cert.getIssuerDN());
		System.out.println("有效期起始日 " + Cert.getNotBefore());
		System.out.println("有效期截至日 " + Cert.getNotAfter());
		System.out.println("签名算法 " + Cert.getSigAlgName());
		byte[] sig = Cert.getSignature();
		System.out.println("签名:" + new BigInteger(sig).toString(16));
		PublicKey pk = Cert.getPublicKey();
		System.out.println("PublicKey:"
		+ Base64.getEncoder().encodeToString(pk.getEncoded()));

如果从密钥库读取

 String pass="080302";
 
          String alias="mykey";
 
          String name=".keystore";
 
          FileInputStream in=new FileInputStream(name);
 
          KeyStore ks=KeyStore.getInstance("JKS");           
 
          ks.load(in,pass.toCharArray());
 
          Certificate c=ks.getCertificate(alias);
 
          in.close();
 
         System.out.println(c.toString( ));
时间: 2024-08-27 09:57:00

Tomcat openSSL自定义签名证书生成与部署的相关文章

nginx源码安装、文件模块的修改、访问加密(自定义签名证书)及负载均衡+轮询

主机环境 redhat6.5 实验环境 服务端 ip172.25.29.1    nginx    服务端 ip 172.25.29.2  apache    服务端 ip 172.25.29.3  apache    测试端 ip 172.25.254.29 安装包       nginx-1.10.1.tar.gz nginx用作反向代理 服务端1 1.  安装nginx 1.解压及简单配置 [[email protected] mnt]# yum install gcc -y      #

HTTPS证书生成和部署

之前写.net core时,部署https很简单(https://www.cnblogs.com/pu369/p/9953896.html) 运行   dotnet dev-certs https --trust  即可.但不太明白原理 有机会在centos7上试一试 参考: https://www.cnblogs.com/pzblog/p/9088286.html https://www.cnblogs.com/liyulong1982/p/6106129.html https://blog.

如何在Win8.1和Win2012上运用PowerShell快速生成、安装、导出自签名证书 (Self-Signed Certificate)

自签名证书用途很广,测试,开发,本地或者云端网站(比如Microsoft Azure Web Site)都会使用到.本文会介绍一种在Win8.1和Win2012 R2上使用PowerShell快速生成自签名证书,自动导出私钥并在LocalMachine\My和LocalMachine\Root下自动安装的方法.非常易用. 目前来说,我们已有的创建Self-Signed证书方法包括用MakeCert和CertMgr的,用SelfSSL或SelfSSL7的,用IIS 7/8自带功能的,或者用比较复杂

Azure 为Point-to-Site VPN连接使用自签名证书

本文介绍如何使用 makecert 创建自签名证书,然后从中生成客户端证书.以下步骤专为在 Windows 10 上使用 makecert 所编写.已对 makecert 进行了验证,以创建与 P2S 连接相兼容的证书. 对于 P2S 连接,证书的首选方法是使用企业证书解决方案,确保颁发常见名称值格式为"[email protected]"的客户端证书,而不是"NetBIOS domain name\username"格式. 如果没有企业解决方案,则需要自签名证书以

使用OpenSSL实现CA证书的搭建过程

什么是CA CA,Catificate Authority,通俗的理解就是一种认证机制.它的作用就是提供证书(也就是服务端证书,由域名,公司信息,序列号,签名信息等等组成)来加强客户端与服务器端访问信息的安全性,同时提供证书的发放等相关工作.国内的大部分互联网公司都在国际CA机构申请了CA证书,并且在用户进行访问的时候,对用户的信息加密,保障了用户的信息安全.理论上来说,任何组织或者个人都可以扮演CA的角色,只不过,难以得到客户端的信任,不能推而广之,最典型应用莫过于12306网站,这个网站就是

使用openssl创建自签名证书及部署到IIS教程

概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsigned.key 2048 然后利用私钥创建自签名证书: openssl req -new -x509 -key myselfsigned.key -out myselfsigned.cer -days 36500 执行上面的两个操作之后会提示输入以下几个内容(为了显示正常尽量使用英文): Countr

openssl生成自签名证书

1.生成x509格式的CA自签名证书 openssl req -new -x509 -keyout ca.key -out ca.crt 2.生成服务端的私钥(key文件)及申请证书文件csr文件 openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr 3.生成客户端的私钥(key文件)及申请证书csr文件 openssl genrsa -des3 -out client

tomcat配置https自签名证书(keytool生成)

tomcat配置https自签名证书(keytool生成) 生成keystore keytool -genkeypair -alias "server" -keyalg "RSA" -validity "365" -keystore "/app/webapp/tomcat/https/server.keystore" [[email protected] https]$ pwd /app/webapp/tomcat/https

HTTPS证书生成原理和部署细节

今天摸索了下 HTTPS 的证书生成,以及它在 Nginx 上的部署.由于博客托管在 github 上,没办法部署证书,先记录下,后续有需要方便快捷操作.本文的阐述不一定完善,但是可以让一个初学者了解大致的原理,同时跟着操作可以为自己的博客/网站部署一个 HTTPS 证书. 网站部署 HTTPS 的重要性 看看下面,部分电信用户访问京东首页的时候,会看到右下角有一个浮动广告: 小白用户以为是京东有意放置的,细心的用户会发现,这个 iframe 一层嵌一层的恶心广告很明显是电信/中间人通过 DNS