2014-11-03 70 views
2

根據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代碼獲得的密鑰不同。

回答

0

什麼

keystore.load(is, passwd); 
PublicKey pubKey = keystore.getCertificate(alias).getPublicKey(); 
String publicKeyString = Base64.encodeBase64String(pubKey.getEncoded()); 

編輯

後被downvoted,這裏的一些更詳細的我怎麼看它:

提供該鏈接的OP:https://docs.jboss.org/author/display/PLINK/Picketlink+as+SP,+Salesforce+as+IDP?_sscc=t,它說:

生成證書後在Salesforce中,您可以將其下載到您的計算機上。

此證書將被用於簽署從Salesforce IDP發送SAMLResponse消息。

型自簽署

後,OP被告知要導入證書,而他現在想取回公鑰:

的keytool -import -file salesforce_idp_cert。 CER -keystore jbid_test_keystore.jks -alias銷售人員-IDP

所以似乎很明​​顯,

  • OP不具有該證書
  • 私鑰沒有,你應該打電話getCertificateChain(),並使用零鏈這個證書
+0

請參閱**更新1 **。我得到的密鑰與實際的私人密鑰不同 – iUser 2014-11-03 08:05:08

+1

您是如何做比較的? keytool -export導出證書,不僅是公鑰。如果你使用的是Windows,可以下載並使用keystore-explorer。 – pma 2014-11-03 08:18:08

+0

導出命令使用公鑰創建了一個public.cert文件。當我做* cat public.cert *時,它顯示了公鑰。而當我檢查兩個是不同的。 – iUser 2014-11-03 08:21:19

0

要獲得與私鑰相關聯的證書返回數組的元素。不是getCertificate()

+0

當我執行* keytool -list -keystore keystore.jks *時,它顯示爲** trustedCertEntry **而不是** PrivateKeyEntry **。那是問題嗎? – iUser 2014-11-03 08:55:13

+0

'getCertificateChain()'返回null – iUser 2014-11-03 09:00:33

+0

然後您錯誤地構建了KeyStore。您必須使用與創建私鑰相同的別名導入簽名證書。你沒有。檢查你鏈接的說明。 – EJP 2014-11-03 09:08:23