最近项目中遇到了这样的需求,故记录下来,希望可以帮到需要的人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")));

// 方式2

Class 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")));

// 加载 Provider

Security.addProvider(provider);

}

// 2. 通过 PIN 码获取秘钥KeyStore

static KeyStore getKeyStore()

{

// 可以通过上面创建的 Provider,生成来自指定提供者的KeyStore信息

// KeyStore ks = KeyStore.getInstance("PKCS11", java.security.Provider);

// 也可以这样省略 java.security.Provider 参数

// 如果不指定 Provider,则从首选Provider开始遍历已经注册的安全提供者,

// 找到第一个支持指定类型的Provider来生成 KeyStore

KeyStore 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 validity

TrustManager[] 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 keystore

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

kmf.init(keystore, pinPassword.toCharArray());

managers = kmf.getKeyManagers();

}

// 实例化SSL上下文 install the keymanager factory, and the trust manager

SSLContext sc = SSLContext.getInstance("SSL");

// 初始化SSL上下文

sc.init(managers, trustAllCerts, new java.security.SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

// prevent checking the hostname for spoofing

HttpsURLConnection.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);

}

}

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

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

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

    为什么80%的码农都做不了架构师?>>>    最近项目中遇到了这样的需求,故记录下来,希望可以帮到需要的人O(∩_∩)O~ 以下以 Linux 环境为基础: 读取硬件 UKEY 的 ...

  2. java p12 ssl_java读取双向证书(p12)证书向微信发送请求

    对有些微信接口为保证安全,需要p12证书进行请求, 获取证书: 获取证书的方式.png PHP用到的证书.png 证书使用说明.png 加载证书的相关请求方式代码: private static Re ...

  3. kafka java获取topic_通过编程方式获取Kafka中Topic的Metadata信息

    如果我们需要通过编程的方式来获取到TopicMetadataRequest请求到 def findLeader(topic: String): Unit = { val consumer = conn ...

  4. java 使用GDAL读取

    一.windows环境下: 1.下载编译好的文件:http://download.gisinternals.com/sdk.php 2.dll文件的两种使用方式: 1.把release-xxxx/bi ...

  5. JAVA通过SSL证书创建MS AD账户及设置密码

    近期由于工作需要整理一下自动化的东西,因为公司去年上线了OA,所以公司的入职系统会提交用户的信息到IT部门,最早的做法是入职到了,IT部门收集用户信息在AD中创建对应的用户信息,所以为了提高管理员的工 ...

  6. java usbkey数字证书_Java创建数字证书

    BouncyCastle下载: 链接:http://pan.baidu.com/s/1vrcL4    密码:6i27 package com.what21.security05; import ja ...

  7. https双向认证访问管理后台,采用USBKEY进行系统访问的身份鉴别,KEY的证书长度大于128位,使用USBKEY登录

    最近项目需求,需要实现用USBKEY识别用户登录,采用https双向认证访问管理后台管理界面,期间碰到过一些小问题,写出来给大家参考下. 1:前期准备工作 USBKEY 硬件:我买的是飞天诚信 epa ...

  8. java pkcs#11读取证书加解密(初学-分享)

    java pkcs#11读取证书加解密(初学-分享) http://www.cnblogs.com/sunfb/archive/2013/02/28/2937227.html 插入USB-KEY, 想 ...

  9. java使用usb4java读取usb连接的设备

    1.最近在做一个java与usb通信的项目,在我原来的理解中,java是不能读取电脑底层设备信息的,所有就让人用C写一个中间程序来传递数据.但是最近在查询资料的时候,看到usb4java是写好的jar ...

最新文章

  1. 打造高效机房就这么简单(一)
  2. python 3读取文件-Python3 yaml文件读写操作
  3. struts2 依赖注入boolean类型的属性时报错
  4. 设计模式:模板方法模式(Template Method)
  5. win10关闭“Windows安全中心”功能的两种方法
  6. Windows 平台下的C++代理类(供C # 使用)
  7. 计算机考试换机密码,Ami换机,让你轻松转移手机资料!
  8. 强化学习ppt_强化学习和最优控制的十个关键点81页PPT汇总
  9. url、href、src 详解
  10. 贪心----多元Huffman编码问题
  11. 数据库实战:SQL Server系列网络课程资料集
  12. CSDN博客积分标准,包括博客勋章等
  13. 最近服务器总被webshell攻击,木马也非常猖獗
  14. java 对象转xml 工具类_工具类 Java对象和XML之间的相互转换-搜云库
  15. 单反相机参数之光圈、快门篇
  16. 神来之笔-线程变量实践
  17. MyEclipse 的注册码 破解步骤
  18. IPFS终将沦为大型韭菜收割机
  19. 每日爬虫练习—爬PPT
  20. 液压减振器 matlab,汽车减振器的结构分析与性能仿真研究

热门文章

  1. VUE项目中px转rem
  2. 怎么简单快速将CAD图纸转换成黑白的WMF格式?
  3. 深度学习算法移植工作内容简介
  4. Ubuntu 安装 OpenMPI
  5. [Egret] 对对碰H5小游戏
  6. hexo添加评论功能
  7. iPhone 12提示“Apple ID 已停用”怎么解决(iPhone技巧)
  8. 设计模式之门面模式和调停者模式
  9. 虚拟轮杆实现触摸屏模拟游戏手柄
  10. 如何看待自己适不适合做网站