Tag: 密钥库

从Keystore获取私钥

我有以下代码从密钥库导出证书和密钥,我在Windows中使用keytool创建: final KeyStore keystore = KeyUtil.loadKeystore(“keystore.jks”, “pass”); UserInfo userinfo = new UserInfo(WSusername, WSpassword); X509Certificate clientcert = KeyUtil.getCertificate(CLIENT_KEY_ALIAS, keystore); X509Certificate servercert = KeyUtil.getCertificate(SERVER_KEY_ALIAS, keystore); PrivateKey clientprivate = KeyUtil.getPrivateKey(CLIENT_KEY_ALIAS, CLIENT_KEY_PASSWORD, keystore); 然而它在最后一行失败了“无法检索用于签名的私钥”它可以检索clientcert,但是当它尝试clientprivate时,它会失败。

没有deleteKey命令从BKS文件丢失密钥

我在我的Android应用程序中使用密钥库(BKS格式)来存储公共私钥对。 该应用程序使用了很长时间,并有10多个公共私钥对。 突然之间,应用程序的主要function之一停止了工作。 发现根本原因如下: BKS文件中只剩下一个公共私钥对。 所有其他密钥对都丢失了。 我在代码中validation了应用程序中的任何位置都没有调用KeyStore.deleteEntry(别名)。 如果出现问题我唯一能找到的地方如下: 我们创建一个密钥对并使用以下方法设置它: KeyStore.setKeyEntry(keyId, keyPair.getPrivate(), getKeyStorePassword(), certChain); 上述方法的javadoc声明如下:如果给定别名已存在,则与给定密钥相关联的密钥库信息将被给定密钥(可能还有证书链)覆盖。 通常,从服务器获取的字符串是UUID,用作别名以在KeyStore中设置新的KeyPair。 因此,新别名与密钥库中已存在的别名相同的可能性非常小。 即使是这种情况,它也只会覆盖一对密钥对。 但是,在这种情况下,大约10个以上的密钥对丢失了。 有没有人知道导致这种密钥对丢失的任何已知问题? 附加信息: 我发现与每个密钥对的公钥相关联的证书仅在1年内有效。 我认为当在密钥库中设置新密钥对时,可以删除证书过期的密钥对。 但是,当我通过将有效期更改为30天来执行测试用例,并将设备时间更改超过30天时,无法再现该问题。 还有一件事我不确定它是否与此问题相关:目前生成的所有证书的序列号是BigInteger.ONE: X509v1CertificateBuilder certBuilder = new JcaX509v1CertificateBuilder(subject,BigInteger.ONE,notBefore,notAfter,subject,keyPair.getPublic()); 我认为这是错误的,但是,我不确定这是否会导致我所遇到的问题。 以下是设备中出现此问题的安全提供程序列表( Security.getProviders() ): AndroidKeyStoreBCWorkaround版本1.0 AndroidOpenSSL版本1.0 BC版本1.52 加密版1.0 HarmonyJSSE 1.0版 AndroidKeyStore版本1.0 因此,所有Java加密操作都是使用AndroidKeyStoreBCWorkaround版本1.0完成的。 该设备是Nexus 5,Android 6.0.1。

使用AES SecretKey的Java KeyStore setEntry()

我目前正在使用Java中的密钥处理类,特别是使用KeyStore。 我正在尝试使用AES实例生成SecretKey,然后使用setEntry()方法将其放在KeyStore中。 我已经包含了我的代码的相关部分: // The KS Object private KeyStore keyStore; private KeyStore.SecretKeyEntry secretKeyEntry; private KeyStore.ProtectionParameter protectionParameter; private KeyGenerator keyGenerator; private SecretKey secretKey, newSecretKey; keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyGenerator = KeyGenerator.getInstance(“AES”); keyGenerator.init(256); newSecretKey = keyGenerator.generateKey(); protectionParameter = new KeyStore.PasswordProtection(KEYSTORE_PASSWORD.toCharArray()); secretKeyEntry = new KeyStore.SecretKeyEntry(newSecretKey); keyStore.setEntry(KEYSTORE_ALIAS, secretKeyEntry, protectionParameter); 我使用的两个常量也定义为字符串。 我不断得到的exception是在我的setEntry()调用中: java.security.KeyStoreException: Cannot store non-PrivateKeys at sun.security.provider.JavaKeyStore.engineSetKeyEntry(Unknown Source) at sun.security.provider.JavaKeyStore$JKS.engineSetKeyEntry(Unknown […]

检查java密钥库中的证书过期日期

我的java应用程序使用密钥库文件,其中我有一个证书,用于与活动目录服务器的ssl连接。 我要做的是检查其到期日期并提示用户是否即将到期。 我的申请开始时我必须这样做。 我的想法是使用外部程序:keytool在密钥库中显示有关某些证书的信息,然后对keytool输出的字符串进行一些解析操作以查找此validation日期。 这是特定keytool命令的输出: Owner: Issuer: CN=CPD Root CA, DC=cpd, DC=local Serial number: 39e8d1610002000000cb Valid from: Wed Feb 22 21:36:31 CET 2012 until: Thu Feb 21 21:36:31 CET 2013 Certificate fingerprints: MD5: 82:46:8B:DB:BC:5C:64:21:84:BB:68:E3:4B:D4:35:70 SHA1: 35:52:CA:F2:11:66:1E:50:63:BC:53:A5:50:C1:F0:1E:62:81:BC:3F Signature algorithm name: SHA1withRSA 问题在于解析日期,因为我无法确定它的显示格式。 有没有更简单的方法来检查java密钥库文件中包含的证书的到期日期?

在java中以运行时递归更改系统属性

我有一个问题,并在java中搜索运行时更改系统属性的示例。 换句话说,我有一个独立的库,它将加载System.setProperty(“javax.net.ssl.trustStore”, trustStorePath) ,其中System.setProperty(“javax.net.ssl.trustStore”, trustStorePath)的值将根据条件而改变。 如果条件发生变化,那么我需要更改trustStorePath的值,并需要设置System Property。 但故事是我第一次设置值时,它存储值并使用它,即使我更改了trustStorePath的值并再次设置系统属性。 这种变化没有反映出来。 那么,我该怎么做呢。 以下是相同的示例代码段。 if (getFile(keyStorePath).exists() && isChanged ) { System.setProperty(“javax.net.ssl.keyStore”, keyStorePath); System.setProperty(“javax.net.ssl.keyStoreType”, “JKS”); System.setProperty(“javax.net.ssl.keyStorePassword”, Pwd); }else if (getFile(testMerchantKeyStorePath).exists() ) { System.setProperty(“javax.net.ssl.keyStore”, testMerchantKeyStorePath); System.setProperty(“javax.net.ssl.keyStoreType”, “JKS”); System.setProperty(“javax.net.ssl.keyStorePassword”,Pwd); }

在ssl(ldaps)的支持下连接活动目录

我试图在ssl的支持下与活动目录连接。 我尝试了以下网站的步骤。 http://confluence.atlassian.com/display/CROWD/Configuring+an+SSL+Certificate+for+Microsoft+Active+Directory 当我尝试从java代码连接活动目录时,它会出现以下错误。 Exception in thread “main” javax.naming.CommunicationException: simple bind fail ed: 172.16.12.4:636 [Root exception is java.net.SocketException: Connection rese t] at com.sun.jndi.ldap.LdapClient.authenticate(Unknown Source) at com.sun.jndi.ldap.LdapCtx.connect(Unknown Source) at com.sun.jndi.ldap.LdapCtx.(Unknown Source) at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source) at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source) at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source) at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source) at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.init(Unknown Source) at javax.naming.InitialContext.(Unknown Source) at […]

为一个别名加载Java KeyStore?

有谁知道是否可以加载KeyStore,以便它只提示给定别名的密码? 例: 在我的密钥库中,我有两个私钥:Alice的加密证书和Bob的加密证书。 当我加载我的密钥库时: keyStore = KeyStore.getInstance(“Windows-MY”, “SunMSCAPI”); keyStore.load(null); 我被提示输入Alice和Bob的密钥存储密码。 一旦输入,我可以使用getKey(“Alice’s Encryption Certificate”, null); 检索Alice的私钥。 我的密钥受Entrust的安全提供程序保护,它是在加载密钥库时提示我输入密码的人。 如果我没有输入Bob的密码并尝试获取他的密钥,它将返回null,这很好,但我想避免密码提示。 是否有可能以某种方式指定我在加载密钥存储区之前只需要Alice的密钥,这样我就不会被提示输入Bob的密码了? 谢谢。

在Android密钥库中存储hmac密钥

我使用下面的代码来创建一个hmac键并将其作为字符串返回。 KeyGenerator keyGen = null; try { keyGen = KeyGenerator.getInstance(“HmacSHA256”); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } SecretKey key = keyGen.generateKey(); byte[] encoded = key.getEncoded(); String s=Base64.encodeToString(encoded, Base64.DEFAULT); Log.i(“Hmac key before encrypt”,s); try { KeyStore keystore = KeyStore.getInstance(“AndroidKeyStore”); keystore.load(null, null); KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry(“temp”, null); RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey(); Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); […]

无法更改密钥库格式

我正在尝试使用最新JRE(版本1.8.0_151)中的keytool创建一些密钥库。 当我使用此命令创建密钥库时keytool -genkey -alias serverprivate -keystore server.private -keyalg rsa -storepass apassword -keypass apassword它向我显示以下警告: Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using “keytool -importkeystore -srckeystore server.private -destkeystore server.private -deststoretype pkcs12”. 所以我输入命令,它说完了,旧的密钥库保存在server.private_old中。 但是当我运行keytool -list -keystore server.private并输入密码时,它仍然被列为JKS而不是PKCS12。 为什么是这样? 更新 它也没有默默地改为pkcs12,因为当我使用KeyStore store = KeyStore.getInstance(“pkcs12”); 在java中它会抛出一个错误,而它在使用getInstance(“JKS”);时工作正常getInstance(“JKS”); […]

java – 如何在密钥库中存储密钥

我需要将2个密钥存储到KeyStore这里是相关的代码: KeyStore ks = KeyStore.getInstance(“JKS”); String password = “password”; char[] ksPass = password.toCharArray(); ks.load(null, ksPass); ks.setKeyEntry(“keyForSeckeyDecrypt”, privateKey, null, null); ks.setKeyEntry(“keyForDigitalSignature”, priv, null, null); FileOutputStream writeStream = new FileOutputStream(“key.store”); ks.store(writeStream, ksPass); writeStream.close(); 虽然我得到了一个execption“私钥必须伴随证书链” 那究竟是什么? 我将如何生成它?