2017-03-09 143 views
0

我想驗證在Java中的證書籤名,但它是失敗的。我想SHA1和SHA1withRSA是有區別的,但我該如何解決它?無法驗證SHA1簽名與RSA

這是使用C#代碼簽名(證書mycer.p12):

static string Sign(string token, string cer_name, string passw) 
     { 
      try 
      { 
       if (!File.Exists(cer_name)) 
       { 
        MessageBox.Show("File not found " + cer_name); 
        return ""; 
       } 
       X509Certificate2 cert = new X509Certificate2(cer_name, passw, X509KeyStorageFlags.Exportable); 
       RSACryptoServiceProvider csp = null; 
       csp = (RSACryptoServiceProvider)cert.PrivateKey; 
       if (csp == null) 
       { 
        MessageBox.Show("No valid cert was found"); 
        return ""; 
       } 
       Encoding encoding = Encoding.GetEncoding("UTF-8"); 
       byte[] data = encoding.GetBytes(token); 
       RSACryptoServiceProvider rsaClear = new RSACryptoServiceProvider(); 
       rsaClear.ImportParameters(csp.ExportParameters(true)); 
       byte[] signature = rsaClear.SignData(data, CryptoConfig.MapNameToOID("SHA1")); 
       bool isValid = csp.VerifyData(data, "SHA1", signature); 
       if (isValid) return Convert.ToBase64String(signature).Trim(new char[] { '\0', '\n' }).Replace("\n", ""); 
       else 
       { 
        MessageBox.Show("Siganture verification = FALSE"); 
        return ""; 
       } 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.ToString()); 
       return ""; 
      } 
     } 

我使用這個命令提取公鑰

openssl pkcs12 -in mycer.p12 -clcerts -nokeys -out publicKEY.pem

現在此代碼在Java中進行驗證,但返回false:

public static boolean verify(String plainText, String signature, String publicKeyFile) { 
      try { 
CertificateFactory f = CertificateFactory.getInstance("X.509"); 
     X509Certificate certificate = (X509Certificate)f.generateCertificate(new FileInputStream(publicKeyFile)); 
       Signature publicSignature = Signature.getInstance("SHA1withRSA"); 
       publicSignature.initVerify(publicKey); 
       publicSignature.update(plainText.getBytes("UTF-8")); 
       byte[] signatureBytes = Base64.decode(signature); 
       return publicSignature.verify(signatureBytes); 
      } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException | UnsupportedEncodingException e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 
+1

此處返回false'publicSignature.verify(signatureBytes);'或者異常'e.printStackTrace();返回false;'?在第二種情況下發布完整的堆棧跟蹤。還請查看publicKeyFile只包含一個證書 – pedrofb

+0

這裏它返回false publicSignature.verify(signatureBytes);我會嘗試不同的證書。 – babboon

+0

同其他證書一樣:/ – babboon

回答

0

這個帖子讓我https://stackoverflow.com/a/16980246/1444413

KeyStore p12 = KeyStore.getInstance("pkcs12"); 
p12.load(new FileInputStream("mycer.p12"), "password".toCharArray()); 
String alias = (String) p12.aliases().nextElement(); 
X509Certificate c = (X509Certificate) p12.getCertificate(alias); 
.... c.getPublicKey() .... 

然後方法驗證()..返回真。