根據PicketLink document中的說明,我已經創建並從sales force下載了證書。使用Java從Keystore獲取公鑰導入證書
我下載的證書,它的名字是mysample.crt和 我將證書導入到一個keysotre。
keytool -import -file mysample.crt -keystore keystore.jks -alias salesforce-idp
要檢查,我出口的公鑰也
keytool -export -alias salesforce-idp -keystore keystore.jks -rfc -file public.cert
我有一個Java代碼來獲取公共密鑰,但它不工作。這是我的代碼
package com.sample.keystore;
import java.io.File;
import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import org.apache.commons.codec.binary.Base64;
public class ExtractPublicKey {
public static void main(String[] args) {
try {
// Load the keystore
File file = new File("/home/user/salesforce-cert/keystore.jks");
FileInputStream is = new FileInputStream(file);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
String alias = "salesforce-idp";
String password = "user";
char[] passwd = password.toCharArray();
keystore.load(is, passwd);
KeyPair kp = getKeyPair(keystore, alias, passwd);
Base64 base64 = new Base64();
PublicKey pubKey = kp.getPublic();
String publicKeyString = base64.encodeBase64String(pubKey
.getEncoded());
System.out.println(publicKeyString);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static KeyPair getKeyPair(KeyStore keystore, String alias, char[] password) throws Exception {
// Get private key
Key key = keystore.getKey(alias, password);
if (key instanceof PrivateKey) {
// Get certificate of public key
java.security.cert.Certificate cert = keystore.getCertificate(alias);
// Get public key
PublicKey publicKey = cert.getPublicKey();
// Return a key pair
return new KeyPair(publicKey, (PrivateKey)key);
}
return null;
}
}
但是當我運行的代碼,我得到下面的異常
java.lang.NullPointerException
at com.sample.keystore.ExtractPublicKey.main(ExtractPublicKey.java:28)
線28指PublicKey pubKey = kp.getPublic();
。因爲該方法返回null而不是密鑰對。這是爲什麼?以及如何獲得公鑰?
更新1
我的代碼更新到
keystore.load(is, passwd);
PublicKey pubKey = keystore.getCertificate(alias).getPublicKey();
String publicKeyString = Base64.encodeBase64String(pubKey.getEncoded());
System.out.println(publicKeyString);
然後我得到如下因素主要
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlKJTbmfEumDR7nAfBbfAstuUvsgKxizZ1mwGc990dSsmgldIhsrLqpAECdf7vl2q2F8DyXciOopZbJPt/UBmpl6M1TJCQ34UyZaYGI2qid8jSNxFYGApfYPxIBJAk9YOAATqqyAREL+i1mUaFfN8WULFDvz6WsuXOjuxBobqjkg4TUumyyVgZda9ksl3aJmft02AfDMw/GCT8gKPTQb3nZP9BwTo5AQkV5fy0cKZ80G4qD+fiuZJ+8IecgFgXl5agZ0y2Wri8i1OGTGw34SUP2gOO+NUd17YA5AO+ocHlH8yzlXHNH7DPQsLo+Uz8CcXV+eLyzxGTGfuiTw8qsPCCwIDAQAB
堅果實際密鑰是不同的。在public,cert中,密鑰與我通過Java代碼獲得的密鑰不同。
請參閱**更新1 **。我得到的密鑰與實際的私人密鑰不同 – iUser 2014-11-03 08:05:08
您是如何做比較的? keytool -export導出證書,不僅是公鑰。如果你使用的是Windows,可以下載並使用keystore-explorer。 – pma 2014-11-03 08:18:08
導出命令使用公鑰創建了一個public.cert文件。當我做* cat public.cert *時,它顯示了公鑰。而當我檢查兩個是不同的。 – iUser 2014-11-03 08:21:19