签发CA证书:单向认证+双向认证

  • 目录
    • 开发前的环境准备:
    • 单向认证:
    • 双向认证:
    • 使用java模拟携带证书请求

目录

开发前的环境准备:

客户端: win10+火狐浏览器/谷歌
服务端: COS7+Tomcat9
Tomcat9的文件路径: /usr/local/tomcat9

单向认证:

一、生成CA根证书

  1. 新建一个目录,用于存放证书

mkdir -p /srv/ftp/cas

  1. 生成CA密钥对

openssl genrsa -out /srv/ftp/cas/cakey.pem 2048 RSA

  1. 生成根证书签发申请

openssl req -new -key /srv/ftp/cas/cakey.pem -out /srv/ftp/cas/cacert.csr -subj /CN=cas.com

  1. 根证书签发

openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey /srv/ftp/cas/cakey.pem -in /srv/ftp/cas/cacert.csr -out /srv/ftp/cas/ca.cer

二、生成服务器的证书

  1. 新建一个目录,用于存放证书

mkdir -p /srv/ftp/cas/server

  1. 生成服务器私钥

openssl genrsa -aes256 -out /srv/ftp/cas/server/server-key.pem 2048
设置密码:mldnjava

  1. 生成服务器证书签发申请

openssl req -new -key /srv/ftp/cas/server/server-key.pem -out /srv/ftp/cas/server/server.csr -subj /CN=cas.com

  1. 服务端证书签发

openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA /srv/ftp/cas/ca.cer -CAkey /srv/ftp/cas/cakey.pem -CAserial /srv/ftp/cas/server/ca.srl -CAcreateserial -in /srv/ftp/cas/server/server.csr -out /srv/ftp/cas/server/server.cer

三、生成客户端的证书

  1. 新建一个目录,用于存放证书

mkdir -p /srv/ftp/cas/client

  1. 生成客户端私钥

openssl genrsa -aes256 -out /srv/ftp/cas/client/client-key.pem 2048
设置密码:mldnjava

  1. 生成客户端证书签发申请

openssl req -new -key /srv/ftp/cas/client/client-key.pem -out /srv/ftp/cas/client/client.csr -subj /CN=cas.com

  1. 客户端证书签发

openssl x509 -req -days 365 -sha1 -CA /srv/ftp/cas/ca.cer -CAkey /srv/ftp/cas/cakey.pem -CAserial /srv/ftp/cas/server/ca.srl -in /srv/ftp/cas/client/client.csr -out /srv/ftp/cas/client/client.cer

四、转换为java可以使用的证书

  1. 生成客户端证书

openssl pkcs12 -export -clcerts -name cas-client -inkey /srv/ftp/cas/client/client-key.pem -in /srv/ftp/cas/client/client.cer -out /srv/ftp/cas/client/client.p12

  1. 生成服务器端证书

openssl pkcs12 -export -clcerts -name cas-server -inkey /srv/ftp/cas/server/server-key.pem -in /srv/ftp/cas/server/server.cer -out /srv/ftp/cas/server/server.p12
设置密码:mldnjava

  1. 在本机系统中导入信任证书,随后会在"/usr/local/tomcat" 目录下生成"ca-trust.p12" 证书文件

keytool -importcert -trustcacerts -alias cas.com -file /srv/ftp/cas/ca.cer -keystore /usr/local/tomcat/ca-trust.p12

  1. 使用keytool工具查看证书信息

keytool -list -keystore /srv/ftp/cas/client/client.p12 -storetype pkcs12 -v

五、配置和启动tomcat

  1. 进入tomcat配置文件

/usr/local/tomcat9/conf/server.xml

<Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslPortocol="TLS" keystoreFile="/srv/ftp/cas/server/server.p12" keystoreType="pkcs12" keystorePass="mldnjava" />
  1. 启动tomcat服务器

/usr/local/tomcat9/bin/catalina.sh start

此时可以使用http请求访问,但并不支持https访问
1.3配置本地的hosts文件
C:\Windows\System32\drivers\etc\hosts
增加配置:10.200.1.87 cas.com
再次重启浏览器输入https://cas.com,成功访问!

双向认证:

  1. 停掉tomcat

/usr/local/tomcat9/bin/catalina.sh stop

  1. 配置tomcat server.xml,替换原来配置的单向认证的配置
<Connector port="443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="true" sslPortocol="TLS" keystoreFile="/srv/ftp/cas/server/server.p12" keystoreType="pkcs12" keystorePass="mldnjava" truststoreFile="/usr/local/tomcat9/ca-trust.p12" truststoreType="jks" truststorePass="mldnjava" />
  1. 启动tomcat,此时再次访问https://cas.com,提示连接失败。需要在证书里面配置您的证书,把/usr/srv/ftp/cas/client/client.p12 这个证书下载下来导入到浏览器您的证书里,重启浏览器,输入https://cas.com,成功访问!

使用java模拟携带证书请求

  1. 根证书可以使用jdk的keytool工具安装,方式有很多种,这里只选用库文件的模式。
    首先,把根证书ca.crt复制一份,重命名为ca.cer,然后把这个文件复制到jdk的jre\lib\security目录下,在这个目录中进行根证书的安装:
keytool -keystore test.truststore -keypass mldnjava -storepass mldnjava -alias DemoCA -import -trustcacerts -file ca.cer

其中,test.truststore可以自定义名称,密码自定义,DemoCA别名自定义,ca.cer即刚才复制过来的文件,最后需要输入一个y确认信任。

  1. java客户端代码:
package com.example.demo.Service;import org.springframework.stereotype.Service;import javax.net.ssl.*;
import java.io.*;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;@Service
public class SSLService {/*** 客户端证书路径*/private final static String CLIENT_CERT_FILE = "C:\\Users\\admin\\Desktop\\client.p12";/*** 客户端证书密码*/private final static String CLIENT_PWD = "mldnjava";/*** 信任库文件路径*/private final static String TRUST_STRORE_FILE = "C:\\Users\\admin\\Desktop\\test.truststore";/*** 信任库密码*/private final static String TRUST_STORE_PWD = "mldnjava";private static String readResponseBody(InputStream inputStream) throws IOException {try {BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));StringBuilder sb = new StringBuilder();String buff = null;while ((buff = br.readLine()) != null) {sb.append(buff).append("\n");}return sb.toString();} finally {inputStream.close();}}private static void httpsCall() throws Exception {// 初始化密钥库KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");KeyStore keyStore = getKeyStore(CLIENT_CERT_FILE, CLIENT_PWD, "PKCS12");keyManagerFactory.init(keyStore, CLIENT_PWD.toCharArray());// 初始化信任库TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");KeyStore trustKeyStore = getKeyStore(TRUST_STRORE_FILE, TRUST_STORE_PWD, "JKS");trustManagerFactory.init(trustKeyStore);// 初始化SSL上下文SSLContext ctx = SSLContext.getInstance("SSL");ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);SSLSocketFactory sf = ctx.getSocketFactory();HttpsURLConnection.setDefaultSSLSocketFactory(sf);String url = "https://cas.com";URL urlObj = new URL(url);HttpsURLConnection con = (HttpsURLConnection) urlObj.openConnection();con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 " +"(KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");con.setRequestProperty("Accept-Language", "zh-CN;en-US,en;q=0.5");con.setRequestMethod("GET");String res = readResponseBody(con.getInputStream());System.out.println(res);}/*** 获得KeyStore*/private static KeyStore getKeyStore(String keyStorePath, String password, String type)throws Exception {FileInputStream is = new FileInputStream(keyStorePath);KeyStore ks = KeyStore.getInstance(type);ks.load(is, password.toCharArray());is.close();return ks;}public static void main(String[] args) throws Exception {httpsCall();}
}
  1. 执行代码,得到结果:

揭开银行U盾的秘密---签发CA证书:单向认证+双向认证(含java代码)相关推荐

  1. 证书类型、自签CA证书、https双向认证(一篇就懂系列)

    #博学谷IT学习技术支持# 文章目录 1.Linux准备环境 2.证书扩展名 3.自签CA证书 3.1 生成根证书 3.2 生成服务端证书 3.3 生成客户端证书 4.开启https,并校验客户端(双 ...

  2. 浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证

    最近在研究openssl签发证书,在网上搜索关于openssl的用法.资料等等,总觉得非常分散,而且讲得比较浅,文章虽然不少,但是缺少真正能给你讲的明白得,仅停留在"能用"上,感慨 ...

  3. 使用自签发CA证书为EMQX开启双向认证

    文章目录 背景信息 1.CA证书信任模型 2.创建证书 2.1 Root CA 证书创建 2.2 emqx 服务端证书签发 2.3 中间CA证书签发 2.4 设备证书签发 3.配置EMQX服务端证书 ...

  4. Debian 10.x自签发CA证书与Apache建立HTTPS安全连接网站

    环境概述 Debian 10.x 安装apache服务 Client可供管理员使用,有三台服务器Rserver,Server01,Server04 Client:10.10.100.x(DHCP获取) ...

  5. Octavia 的 HTTPS 与自建、签发 CA 证书

    目录 文章目录 目录 Octavia 为什么需要自建 CA 证书? GenerateServerPEMTask CertComputeCreate Amphora Agent AmphoraAPICl ...

  6. 创建自己的CA机构 - openssl cert 双向认证

    为什么80%的码农都做不了架构师?>>>    1. 创建 openssl.cnf [ ca ] default_ca = subchen_ca[ subchen_ca ] cert ...

  7. ROOT证书、CA证书和使用CA签发的X.509证书

    简介 日常开发中,我们程序员不怎么会接触证书相关的问题,对信息安全领域相关的内容知之甚少.因为平时主要实现的业务很少要直接面向底层的通信,也就很少关注这证书这样的知识.在一般情况下,我们仅仅只是在使用 ...

  8. Linux CA证书与https讲解

    1.什么是CA证书. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在 ...

  9. ssl握手过程和ca证书验证

    转载:https://www.cnblogs.com/cposture/p/9029014.html SSL 认证 可以将 SSL 服务器与客户端之间的通信配置为使用单向或双向 SSL 认证. 单向 ...

  10. rhel6.3下使用openssl来生成CA证书并颁发证书实例解析

    一.配置OPENSSL [root@test1 /]# rpm -qa|grep openssl openssl-1.0.0-20.el6_2.5.i686 [root@test1 /]# cd /e ...

最新文章

  1. “智慧城市”方便百姓生活服务企业发展
  2. MyBatis Plus——忽略某个实体类属性和数据库表字段之间的映射关系
  3. composer mysql_php – 无法看到mysql数据库时,composer安装失败
  4. P1850 [NOIP2016 提高组] 换教室
  5. 什么是 gRPC ?
  6. 编程学习记录11:Oracle数据库的一些基本操作1,创建用户,授权
  7. 由sock引起的感想
  8. Python配置opencv并在命令行运行
  9. 无法打开包括文件: “QTcpSocket”: No such file or directory
  10. rtmp服务器开源项目,rtmp直播相关的开源项目
  11. BZOJ3039 玉蟾宫(单调栈)
  12. python+selenium+request实行全自动12306抢票和购票
  13. 堆外缓存是什么? OHC 堆外缓存使用简介
  14. ubuntu 安装eclipes
  15. 数据告诉你,全世界到底有多少人在炒币
  16. 用Qt做的拼图小游戏
  17. 手机投屏到电脑 -- 小黑超细日常教程
  18. go语言 格式化输出fmt.Printf()使用大全
  19. 05丨指标关系:你知道并发用户数应该怎么算吗?
  20. 三相LCL型并网逆变器电流闭环虚拟阻尼控制Simulink仿真

热门文章

  1. pdflatex和xelatex的使用差别和建议
  2. 亚马逊 速卖通 Lazada 敦煌网测评自养号技巧知识
  3. win10 AD15 安装步骤
  4. esp32 esp8285 wf6000OTA升级小记
  5. laravel对象转数组
  6. 极大似然函数求解_快速理解极大似然法
  7. OpenCV图像处理--opencv摄像头播放视频
  8. 淘票票经典Python爬虫案例
  9. matlab在mac中好用吗,Matlab Mac版上手
  10. 什么是企业能源管理系统,包括哪些功能?