JKS、BKS、PKCS12证书之间转换

SpringBoot使用JKS或PKCS12证书实现https 可以利用jdk自带的keytool工具来生成证书文件,默认生成的是JKS证书cmd命令如下: 执行如下命令,并按提示填写证书内容,最后会生成server.keystore文件。 阅读详情
常用的证书库: 
JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。 
JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDES) 
PKCS#12(PFX)是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。 
BKS来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。 
UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。SunJDK允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。 

/** 
     * PFX证书转换为JKS(Java Key Store) 
     *  
     * @param pfxPassword 
     *            PFX证书密码 
     * @param pfxFilePath 
     *            PFX证书路径 
     * @param jksPassword 
     *            JKS证书密码 
     * @param jksFilePath 
     *            JKS证书路径 
     */  
    public static void covertPFXtoJKS(String pfxPassword, String pfxFilePath, String jksPassword, String jksFilePath)  
    {  
        FileInputStream fis = null;  
        FileOutputStream out = null;  
        try  
        {  
            // 加载PFX证书  
            KeyStore inputKeyStore = KeyStore.getInstance("PKCS12");  
            fis = new FileInputStream(pfxFilePath);  
            char[] inPassword = pfxPassword == null ? null : pfxPassword.toCharArray();  
            char[] outPassword = jksPassword == null ? null : jksPassword.toCharArray();  
            inputKeyStore.load(fis, inPassword);  
  
            KeyStore outputKeyStore = KeyStore.getInstance("JKS");  
            outputKeyStore.load(null, outPassword);  
            Enumeration<String> enums = inputKeyStore.aliases();  
            while (enums.hasMoreElements())  
            {  
                String keyAlias = enums.nextElement();  
                if (inputKeyStore.isKeyEntry(keyAlias))  
                {  
                    Key key = inputKeyStore.getKey(keyAlias, inPassword);  
                    Certificate[] certChain = (Certificate[]) inputKeyStore.getCertificateChain(keyAlias);  
                    outputKeyStore.setKeyEntry(keyAlias, key, pfxPassword.toCharArray(), (java.security.cert.Certificate[]) certChain);  
                }  
            }  
            out = new FileOutputStream(jksFilePath);  
            outputKeyStore.store(out, outPassword);  
        } catch (Exception e)  
        {  
            e.printStackTrace();  
        } finally  
        {  
            try  
            {  
                if (fis != null)  
                {  
                    fis.close();  
                }  
                if (out != null)  
                {  
                    out.close();  
                }  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
        }  
    }  
    
/** 
     * 从JKS格式转换为PKCS12格式 
     *  
     * @param jksFilePath 
     *            String JKS格式证书库路径 
     * @param jksPasswd 
     *            String JKS格式证书库密码 
     * @param pfxFilePath 
     *            String PKCS12格式证书库保存文件夹 
     * @param pfxPasswd 
     *            String PKCS12格式证书库密码 
     */  
public void covertJSKToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath, String pfxPasswd) throws Throwable  
    {  
        FileInputStream fis = null;  
        try  
        {  
            KeyStore inputKeyStore = KeyStore.getInstance("JKS");  
            fis = new FileInputStream(jksFilePath);  
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();  
            char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray();  
            inputKeyStore.load(fis, srcPwd);  
  
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");  
            Enumeration<String> enums = inputKeyStore.aliases();  
            while (enums.hasMoreElements())  
            {  
                String keyAlias = (String) enums.nextElement();  
                System.out.println("alias=[" + keyAlias + "]");  
                outputKeyStore.load(null, destPwd);  
                if (inputKeyStore.isKeyEntry(keyAlias))
                {  
                    Key key = inputKeyStore.getKey(keyAlias, srcPwd);  
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain);  
                }  
                String fName = pfxFolderPath + "_" + keyAlias + ".pfx";  
                FileOutputStream out = new FileOutputStream(fName);  
                outputKeyStore.store(out, destPwd);  
                out.close();  
                outputKeyStore.deleteEntry(keyAlias);  
            }  
        } finally  
        {  
            try  
            {  
                if (fis != null)  
                {  
                    fis.close();  
                }  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
        }  
    }  

/** 
     * 从BKS格式转换为PKCS12格式 
     *  
     * @param jksFilePath 
     *            String JKS格式证书库路径 
     * @param jksPasswd 
     *            String JKS格式证书库密码 
     * @param pfxFilePath 
     *            String PKCS12格式证书库保存文件夹 
     * @param pfxPasswd 
     *            String PKCS12格式证书库密码 
     */  
public void covertBKSToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath, String pfxPasswd) throws Throwable  
    {  
        FileInputStream fis = null;  
        try  
        {  
            KeyStore inputKeyStore = KeyStore.getInstance("BKS", new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());  
            fis = new FileInputStream(jksFilePath);  
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();  
            char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray();  
            inputKeyStore.load(fis, srcPwd);  
  
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12");  
            Enumeration<String> enums = inputKeyStore.aliases();  
            while (enums.hasMoreElements())  
            {  
                String keyAlias = (String) enums.nextElement();  
                System.out.println("alias=[" + keyAlias + "]");  
                outputKeyStore.load(null, destPwd);  
                if (inputKeyStore.isKeyEntry(keyAlias))
                {  
                    Key key = inputKeyStore.getKey(keyAlias, srcPwd);  
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain);  
                }  
                String fName = pfxFolderPath + "_" + keyAlias + ".pfx";  
                FileOutputStream out = new FileOutputStream(fName);  
                outputKeyStore.store(out, destPwd);  
                out.close();  
                outputKeyStore.deleteEntry(keyAlias);  
            }  
        } finally  
        {  
            try  
            {  
                if (fis != null)  
                {  
                    fis.close();  
                }  
            } catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
        }  
    }  

/** 
     * 列出JKS库内所有X509证书的属性 
     *  
     * @param jksFilePath 
     *            证书库路径 
     * @param jksPasswd 
     *            证书库密码 
     * @param algName 
     *            库类型 
     */  
    public static void listAllCerts(String jksFilePath, String jksPasswd, String algName)  
    {  
        try  
        {  
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();  
            FileInputStream in = new FileInputStream(jksFilePath);  
            KeyStore ks = KeyStore.getInstance(algName);  
            ks.load(in, srcPwd);  
            Enumeration<String> e = ks.aliases();  
            while (e.hasMoreElements())  
            {  
                String alias = e.nextElement();  
                java.security.cert.Certificate cert = ks.getCertificate(alias);  
                if (cert instanceof X509Certificate)  
                {  
                    X509Certificate X509Cert = (X509Certificate) cert;  
                    System.out.println("**************************************");  
                    System.out.println("版本号:" + X509Cert.getVersion());  
                    System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16));  
                    System.out.println("主体名:" + X509Cert.getSubjectDN());  
                    System.out.println("签发者:" + X509Cert.getIssuerDN());  
                    System.out.println("有效期:" + X509Cert.getNotBefore());  
                    System.out.println("签名算法:" + X509Cert.getSigAlgName());  
                    System.out.println("输出证书信息:\n" + X509Cert.toString());  
                    System.out.println("**************************************");  
                }  
            }  
        } catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
    
    /*
    * 列出BKS库内所有X509证书的属性 
    *  
    * @param jksFilePath 
    *            证书库路径 
    * @param jksPasswd 
    *            证书库密码 
    * @param algName 
    *            库类型 
    */ 
    public static void listAllCertsBks(String jksFilePath, String jksPasswd, String algName)  
    {  
        try  
        {  
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray();  
            FileInputStream in = new FileInputStream(jksFilePath);  
            KeyStore ks = KeyStore.getInstance(algName, new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());    
            ks.load(in, srcPwd);  
            Enumeration<String> e = ks.aliases();  
            while (e.hasMoreElements())  
            {  
                String alias = e.nextElement();  
                java.security.cert.Certificate cert = ks.getCertificate(alias);  
                if (cert instanceof X509Certificate)  
                {  
                    X509Certificate X509Cert = (X509Certificate) cert;  
                    System.out.println("**************************************");  
                    System.out.println("版本号:" + X509Cert.getVersion());  
                    System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16));  
                    System.out.println("主体名:" + X509Cert.getSubjectDN());  
                    System.out.println("签发者:" + X509Cert.getIssuerDN());  
                    System.out.println("有效期:" + X509Cert.getNotBefore());  
                    System.out.println("签名算法:" + X509Cert.getSigAlgName());  
                    System.out.println("输出证书信息:\n" + X509Cert.toString());  
                    System.out.println("**************************************");  
                }  
            }  
        } catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    } 
Q窗口操作函数(窗口最大化,全屏,隐藏最大化最小化按钮) Qt窗口中的一些小技术总结   //Qt主窗口没有最小化,最大化按钮且最大化显示  int main(int argc, char *argv[])  {  QApplication a(argc, argv);  TestQtForWinCE w;  w.setWindowFlags(w.windowFlags()&amp; ~Qt::WindowMaximizeButtonHin... 阅读详情

相关推荐

PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化

也可以把标题类设置为一个接口文件,调用即可,不过这要修改逻辑代码。通过这个函数获取改变大小的坐标范围,只有鼠标处于这个范围,就可以改变程序窗口大小。函数不是按钮的信号与槽函数,在这里说是因为它是设置三个按钮的图标关键字,使用了。百度网盘程序的标题栏的颜色便灰,内容窗口便白色,使用屏幕拾色器获取具体颜色编码。因为设置了主窗口透明化,所以要专门用这个过滤器来恢复鼠标形状,两个子窗口。我只设置了三个方向可以改变窗口大小,其他的可以自行修改。单独设置一个函数来整理无边框,标题和图标设置。初始化函数里,会很混乱的。

集电极 1万+

pkcs12、pkcs7、pkcs8详解

PKCS(Public Key Cryptography Standards)是一系列的密码学标准,由 RSA Security 公司制定。PKCS 定义了很多与公钥密码学相关的标准。

N阶二进制的博客 5872

Qt窗口操作函数(最大化,全屏,隐藏最大化,最小化)

Qt窗口中的一些小技术总结   //Qt主窗口没有最小化,最大化按钮且最大化显示  int main(int argc, char *argv[])  {  QApplication a(argc, argv);  TestQtForWinCE w;  w.setWindowFlags(w.windowFlags()& ~Qt::WindowMaximizeButtonHint& ~

软件工程 2430

使用OpenSSL生成PKCS#12格式的证书和私钥

我们可以根据需要进行更多的配置和调整。此外,如果您具有可用的CA证书和私钥,可以使用类似的命令生成PKCS12文件。确保妥善保管和保护您的私钥和证书。

应无所住而生其心 8791

vue实现漂亮的窗口拖拽效果(可改变大小、最大化、关闭)

本文实例讲述了JS实现漂亮的窗口拖拽效果,供大家参考,具体如下: 特点: ① 窗口可以拖动; ② 窗口可以通过八个方向改变大小; ③ 窗口可以最大化、还原、关闭; ④ 限制窗口最小宽度/高度。 html部分 <template> <!-- 可拖拽,放大缩小,最大化可视的窗口 --> <div id="drag" ref="drag"> <div class="title"> <div class="text">这是

MRSLLLL_的博客 3206

MFC对话框最大化/窗口化及控件自适应缩放以及嵌套窗口缩放

1. 实现方法(计算窗口放大/缩小比例,控件相应缩放并改变位置,但会存在一定问题) 先在窗口类的头文件中添加相应变量与函数(其中OnSize由类向导消息WM_SIZE生成): // XXXDlg.h // 窗口放大所需变量 private: BOOL m_IsInitialized; int m_nOldCx, m_nOldCy; // 变量需要在类的构造函数中初始化 public...

o707191418的博客 7758

PKCS12证书生成完整步骤

将私钥和证书合并为PKCS12格式 openssl pkcs12 -export -in cert.crt -inkey private.key -out cert.p12。创建自签名证书 openssl x509 -req -days 3650 -in cert.csr -signkey private.key -out cert.crt。生成证书请求 openssl req -new -key private.key -out cert.csr。

weixin_53069745的博客 2795

解决360浏览器页面小窗口问题,轻松实现最大化浏览

通过以上两种方法,我们可以轻松解决360浏览器页面小窗口的问题,实现最大化浏览。无论是通过属性设置还是注册表编辑器,这两种方法都非常有效且易于操作。希望本文能够帮助到那些遇到类似问题的用户,让大家在浏览网页时能够享受到更加舒适和清晰的视觉体验。同时,也希望大家在使用浏览器的过程中注意保护自己的眼睛和身体健康,合理安排上网时间。

mmoo_python的博客 2859

Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)

将要全屏的 Qt 子窗口调用 setWindowFlags(Qt::Window) 将其类型提升为顶级窗口模式,然后调用 showFullScreen() 函数将子窗口全屏显示。当然全屏后还要恢复正常,即调用 setWindowFlags(Qt::subwindow) 将子窗口设置为非顶级窗口,再调用 showNormal() 还原子窗口显示。在使用 QDialog 时,默认情况下只有 “这是什么” 和 “关闭” 按钮,但是我们习惯有最大化和最小化按钮。即得到屏幕分辨率,如 1024*768。

Harrytsz的博客 7287

【Qt】自定义标题栏并实现最小化/最大化/关闭窗口功能

之前文章中实现了自定义窗口的拖拽移动,见【Qt】自定义标题栏并实现鼠标拖拽移动 今天我们实现自定义的系统按钮:最小化、最大化、关闭窗口 1.先去掉窗口的边框 /* 标题栏样式 */ this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint |

李宁宁 1万+

手把手教你用Qt Designer打造可拖拽无边框窗口(含最大化还原特效)

本文详细介绍了如何使用Qt Designer和C++代码实现功能完整的可拖拽无边框窗口。教程从界面设计开始,逐步讲解如何移除系统边框、实现基础窗口拖拽,并重点解决了最大化状态下通过拖拽标题栏优雅还原窗口的核心交互难题,提供了清晰的代码示例和优化思路。

l3m4n的博客 1086

MFC去掉窗口右上方最大化最小化关闭按钮

MFC去掉窗口右上方最大化最小化关闭按钮

eickandy的专栏 9972

【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口

【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口前言1.文件架构【新增】2.实现效果【增加】3. 标题栏Qtdesigner的ui设计(ui设计代码)4. 设置标题和图标【改】5.最大化最小化关闭事件6.窗口拖动移动,窗口改变大小7.增加内容窗口事件【新增】8.仿百度网盘色调QSS美化【

集电极 1万+

解决方案--duilib中禁止一个窗口双击最大化

用duilib开发了一个窗口,比如是登录窗口,那么这个窗口的窗口的双击最大化就毫无意义,甚至带来灾难,我们就要明确禁止这样的行为。我们应该明确,一个窗口创建的时候就赋予了它一些属性,那我们就首先看看如何创建窗口的,即Create函数。例如,你定义了一个窗口类叫LogInWnd,你会在需要的时候这用进行创建一个窗口:LogInWnd login_wnd; login_wnd.Create(nullpt

一蓑烟雨任平生 也无风雨也无晴 6211

matplotlib窗口状态管理(最大化、最小化、全屏、置顶、控制按钮,基于PyQT5后端)

使用`matplotlib`绘图时,`matplotlib`绘图窗口的状态管理与后端的具体实现息息相关。与`matplotlib`窗口状态相关源码定义在`matplotlib.backends.backend_qt5`模块的`FigureManagerQT`类当中,与窗口状态相关的方法实现均依赖于`window`属性(即`figure.canvas.manager.window`),而`window`属性是`PyQT5`中`QMainWindow`类的实例。在`matplotlib`中,仅定义了全屏切

mighty13的专栏 2万+

VS+Qt设置窗口尺寸(一):固定窗口大小,无法最大化,调节尺寸

VS+Qt设置窗口尺寸(一):固定窗口大小,无法最大化,调节尺寸

Jack1009HF的博客 4490

禁用并删除Windows自带的最大化(还原),最小化按钮,设置窗口最大化,禁止拖动

如果想实现对windows某个窗口的操作,首先需要拿到这个窗口的窗口句柄,实际上拿到了窗口句柄以后就可以对窗口做任何修改,这里用最大化和最小化来举例子。 Windows Hook 1,《逆向工程核心原理》第三部分,Dll注入介绍了使用SetWindowsHookEx函数来拦截窗口事件,SetWindowsHookEx可以在每个进程中插入指定的Dll函数,此dll可以拿到运行程序的所有Windo...

Niap的博客 2780

修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置

原标题:串口虚拟化 | 串口服务器Nport 5630 设置JZGKCHINA项目改造,客户需要对IFix4.5进行升级,并优化通讯,在不改变原来配置的基础上逐步进行替换。需要将IFix升级到IFix5.9,数据库升级为SQL Server 2016,客户现场使用的智能仪表都是支持Modbus RTU协议的,因原来的手拉手的通讯方式的,当一台仪表掉线后,会影响到其他仪表的通讯,所以此次在不改变原有...

weixin_31688465的博客 2408
上一篇: 密钥库文件格式【Keystore】
下一篇: 理解OAuth 2.0
whackw
博客等级 码龄16年 203粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值