为什么80%的码农都做不了架构师?>>>   

最近项目中遇到了这样的需求,故记录下来,希望可以帮到需要的人O(∩_∩)O~

以下以 Linux 环境为基础:

读取硬件 UKEY 的SSL证书信息,需要硬件厂商提供:UKEY型号名称驱动文件(类似pkcs11.so)。

直接上代码段示例:

// 厂商提供的UKEY型号名称
static final String UKEY_PROVIDER = "xxx";// UKEY驱动lib库文件
static final String UKEY_LIB = "/usr/local/lib/xx pkcs11.so";// UKEY的PIN码
static final Strign UKEY_PIN = "123456";// 1. 通过上面的UKEY硬件信息创建 java.security.Provider
static void initProvider()
{// 固定格式的配置信息// 例如:cfg = "name = OpenSC\n"//             + "library = /usr/lib/opensc-pkcs11.so\n";String ukeyCfg = "name = %s\nlibrary = %s\n";ukeyCfg = String.format(ukeyCfg, UKEY_PROVIDER, UKEY_LIB);// 方式1//java.security.Provider provider = new sun.security.pkcs11.SunPKCS11(new ByteArrayInputStream(ukeyCfg.getBytes("UTF-8")));// 方式2Class sunPkcs11 = Class.forName("sun.security.pkcs11.SunPKCS11");Constructor pkcs11Constr = sunPkcs11.getConstructor(InputStream.class);java.security.Provider provider = (Provider) pkcs11Constr.newInstance(new ByteArrayInputStream(ukeyCfg.getBytes("UTF-8")));// 加载 ProviderSecurity.addProvider(provider);
}// 2. 通过 PIN 码获取秘钥KeyStore
static KeyStore getKeyStore()
{// 可以通过上面创建的 Provider,生成来自指定提供者的KeyStore信息// KeyStore ks = KeyStore.getInstance("PKCS11", java.security.Provider);// 也可以这样省略 java.security.Provider 参数// 如果不指定 Provider,则从首选Provider开始遍历已经注册的安全提供者,// 找到第一个支持指定类型的Provider来生成 KeyStoreKeyStore ks = KeyStore.getInstance("PKCS11");ks.load(null, UKEY_PIN.toCharArray());return ks;
}/*** 3. 创建 HttpsConnection双向认证上下文环境** @param keystore 步骤2中创建的 keystore* @param alias 证书别名,可以为空* @param pinPassword UKEY要求输入的PIN码*/
static void loadSSLContext(KeyStore keystore, String alias, String pinPassword)
{// 实例化信任库,make a naive trust manager that does not check cert validityTrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {// ignore}public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {// ignore}}};KeyManager[] managers;if(alias != null && alias.trim().length() > 0) {managers = new KeyManager[] { new AliasKeyManager(keystore, alias, pinPassword) };} else {// 初始化密钥工厂 create a KeyManagerFactory from the keystoreKeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");kmf.init(keystore, pinPassword.toCharArray());managers = kmf.getKeyManagers();}// 实例化SSL上下文 install the keymanager factory, and the trust managerSSLContext sc = SSLContext.getInstance("SSL");// 初始化SSL上下文sc.init(managers, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());// prevent checking the hostname for spoofingHttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {public boolean verify(String hostname, SSLSession session) {return true;}});}/*** 密钥管理器【KeyManager】中证书别名的处理*/
static class AliasKeyManager implements X509KeyManager
{private KeyStore _ks;private String _alias;private String _password;public AliasKeyManager(KeyStore ks, String alias, String password) {this._ks = ks;this._alias = alias;this._password = password;}public String chooseClientAlias(String[] str, Principal[] principal, Socket socket) {return this._alias;}public String chooseServerAlias(String str, Principal[] principal, Socket socket) {return this._alias;}public X509Certificate[] getCertificateChain(String alias) {try {return (X509Certificate[]) _ks.getCertificateChain(alias);} catch (Exception e) {e.printStackTrace();return null;}}public String[] getClientAliases(String str, Principal[] principal) {return new String[] { this._alias };}public PrivateKey getPrivateKey(String alias) {try {return (PrivateKey) this._ks.getKey(alias, this._password == null ? null : this._password.toCharArray());} catch (Exception e) {e.printStackTrace();return null;}}public String[] getServerAliases(String str, Principal[] principal) {return new String[] { this._alias };}
}// 4. demo
static void test()
{HttpsURLConnection urlCon = (HttpsURLConnection) (new URL("https://your url")).openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(urlCon.getInputStream()));String line = null;while ((line = in.readLine()) != null) {System.out.println(line);}in.close();
}// 可选:打印 KeyStore中的信息
private void printKeyStoreInfo(KeyStore keystore)
{System.out.println("Provider : " + keystore.getProvider().getName());System.out.println("Type : " + keystore.getType());System.out.println("Size : " + keystore.size());Enumeration en = keystore.aliases();while (en.hasMoreElements()) {String alias = (String) en.nextElement();System.out.println("Alias: " + alias);X509Certificate cert = (X509Certificate) keystore.getCertificate(alias);System.out.println("Certificate: " + cert);PrivateKey privateKey = (PrivateKey) keystore.getKey(alias, null);System.out.println("Private key: " + privateKey);}
}

注:上面的只是核心代码段,实际使用需要进行调整。


转载于:https://my.oschina.net/jsan/blog/647443

Java读取硬件USBKey(简称UKEY)中的SSL证书信息,创建双向SSL认证上下文环境相关推荐

  1. java usbkey ssl_Java读取硬件USBKey(简称UKEY)中的SSL证书信息,创建双向SSL认证上下文环境...

    最近项目中遇到了这样的需求,故记录下来,希望可以帮到需要的人O(∩_∩)O~ 以下以 Linux 环境为基础: 读取硬件 UKEY 的SSL证书信息,需要硬件厂商提供:UKEY型号名称.驱动文件(类似 ...

  2. 转: 如何从keystore file中查看数字证书信息

    转: http://www.shuziqianming.com/201302/certificate-information-in-a-keystore-file/ 如何从keystore file中 ...

  3. java没有manifest.mf_java - IntelliJ IDEA中错误的Manifest.mf创建.j

    java - IntelliJ IDEA中错误的Manifest.mf创建.j 我试图通过IntelliJ IDEA的jar工件将使用OptaPlanner 6.0.1库的项目打包到.jar中,而不是 ...

  4. java 读取硬件设备发送数据_Java网络编程基础

    1.软件结构 C/S结构:全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构:全称为Browser/Server结构,是指浏览器和服务器结构.常见浏 ...

  5. java读取xml路径问题_java 中读取xml 和绝对路径

    一.得到绝对路径 本人用到的不多,就列举常用的. 以上2种可读取固定配置文件可用得到绝对路径 1.System.getProperty("user.dir"); 这个东西局限性十分 ...

  6. java读取字节效率最高_java中字节流读写和字符流读写怎么理解?哪个效率更高...

    我们java中的io流分为两大类,字节流和字符流. 可是在具体使用的时候怎么视情况进行使用? 怎么使用更加有效率? 有两个例子,帮忙看看解释一下,用哪种比较有效率以及适用情况. 下面是用字符流进行读写 ...

  7. java读取服务器图片大小,SpringMVC中MultipartFile上传获取图片的宽度和高度详解

    SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定文件的类型(MIME) ".doc":& ...

  8. java读取本地图片在浏览器中显示

    @RequestMapping(value = "/tupian", method = RequestMethod.GET)public void IoReadImage(Http ...

  9. java 读取硬件设备发送数据_基于java的物联网设备控制系统源码分享,loT硬件智能化...

    基于Paas服务的物联网平台,用于快速开发.部署物联设备接入. 降低物联网企业研发.运维和运营成本,帮助企业将物联设备快速互联网化,提高物联网项目的落地能力. 系统截图 系统核心特性 1.可扩展性强 ...

最新文章

  1. json 字符串传到action之后的处理,遍历. 练习代码片
  2. start_stop_time
  3. WPF-13:资源文件需要手动引用问题
  4. 打印表格_表格怎么打印出来
  5. zedgraph支持游标吗_经典格斗游戏中的隐藏人物,当年在游戏厅你能选出来吗
  6. Sea Battle
  7. zzuli 2525: 咕咕的搜索序列
  8. 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能
  9. python拨号_python 拨号代码(win10 系统亲测有效)
  10. System学习笔记004---Windows系统中hosts文件的作用_Zookeeper在SpringBoot中报错需要配置一下这个文件
  11. outlook搜索栏跑到上面去了_Outlook邮箱批量下载邮件附件+快速复制文件名
  12. 优化MyBatis配置文件中的配置
  13. Android学习(五)—— Android初级控件
  14. 三國演義與三國志兩部文本的導讀概要2019年5月11日
  15. Python强智教务系统模拟登录的两种方式
  16. 哈工大CSAPP大作业:程序人生-Hello’s P2P
  17. 怎么重装服务器的系统,怎么重装服务器操作系统
  18. loss scale的理解
  19. Java 获取对象占用内存大小
  20. 解决 PR 或 AE 启动不了桌面弹出 Crash 文件

热门文章

  1. flex 换行布局,最后一行不满时问题处理
  2. RPA「C位」卷王,5行代码搞定订单自动发货!
  3. flex布局垂直居中并换行展示内容
  4. c# 在word中插入表格
  5. 使用docker 训练DNN模型报错share memory不足
  6. 不只为了装盗版 给你讲述iPhone越狱的十大原因
  7. 更改pureftpd vsftpd与proftpd的默认端口
  8. springboot 整合 oshi-core 监控 JVM及操作系统
  9. Oracle 中的四舍五入
  10. Eclipse中Python注释颜色