2016-09-05 6 views
1

システム(機械)に存在する証明書を使用してデータに署名する方法を知っていますが、ブラウザ上に存在するcertiを使用して、以下はコードです。誰かが私のコードが間違っているのを見つけたら、その正しさについてはわからないので私に知らせてください。
PS - このコードは動作します。Javaを使用してブラウザにインストールされた証明書を使用してデータに署名したい

import java.io.FileInputStream; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.Signature; 
import java.security.cert.X509Certificate; 
import java.util.Enumeration; 

public class class123 { 
    public static void main(String[] args) { 
    String input = "shubham"; 
    byte[] signature = createSignature(input.getBytes()); 
    System.out.println(createSignature(input.getBytes())); 
    verifySignature(input.getBytes(), signature); 
} 

private static byte[] createSignature(byte[] file) { 
    byte[] signature = null; 
    String Password="abc"; 
    try { 
     java.security.KeyStore keyStoreFile = java.security.KeyStore.getInstance("PKCS12"); 
     keyStoreFile.load(new FileInputStream("D:\\1.p12"), Password.toCharArray()); //address of certificate (pfx file) and corresponding password. 
     Enumeration<String> aliases = keyStoreFile.aliases(); 
     String alias = aliases.nextElement(); 
     PrivateKey privateKey = (PrivateKey) keyStoreFile.getKey(alias, Password.toCharArray()); 

     Signature dsa = Signature.getInstance("SHA1withRSA"); 
     dsa.initSign(privateKey); 
     dsa.update(file, 0, file.length); 
     signature = dsa.sign(); 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
    return signature; 

} 

private static void verifySignature(byte[] file, byte[] sign) { 
    String Password="abc"; 
    try { 
     java.security.KeyStore keyStoreFile =  java.security.KeyStore.getInstance("PKCS12"); 
     keyStoreFile.load(new FileInputStream("D:\\1.p12"), Password.toCharArray()); 
     Enumeration<String> aliases = keyStoreFile.aliases(); 
     String alias = aliases.nextElement(); 
     Signature dsa = Signature.getInstance("SHA1withRSA"); 
     dsa.initVerify(((X509Certificate) keyStoreFile.getCertificate(alias)).getPublicKey()); 
     dsa.update(file); 
     boolean ret = dsa.verify(sign); 
     System.out.println(ret); 


    } catch (Exception e) { 

     e.printStackTrace(); 
    } 


} 

}

+0

忘れてしまったのは、Webベースのアプリケーションです。 –

答えて

-1

それは私が署名し、検証し、それはあなたを助けるかもしれないし、Microsoft証明書ストアにアクセスしているときに前に書いたように親切にthis blog postを確認し、大丈夫です。

+0

コードをありがとう。また、javaを使用してブラウザ上に存在する証明書を取得する手助けができたら教えてください。 (またはその他の技術) –

-1
import java.io.FileOutputStream; 
import java.net.URL; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateExpiredException; 
import java.security.cert.X509Certificate; 
import javax.net.ssl.HttpsURLConnection; 

public class CertificateFromBrowser { 
    public static void main(String[] args) throws Exception { 
     testConnectionTo(""); // pass the url (eg: https://www.example.com) 
    } 

    public static void testConnectionTo(String aURL) throws Exception { 
     URL destinationURL = new URL(aURL); 
     HttpsURLConnection conn = (HttpsURLConnection) destinationURL.openConnection(); 
     conn.connect(); 
     Certificate[] certs = conn.getServerCertificates(); 
     System.out.println("nb = " + certs.length); 
     for (Certificate cert : certs) { 
      System.out.println(""); 
      System.out.println(""); 
      System.out.println(""); 
      System.out.println("################################################################"); 
      System.out.println(""); 
      System.out.println(""); 
      System.out.println(""); 
      System.out.println("Certificate is: " + cert); 
      if (cert instanceof X509Certificate) { 
       try { 
        ((X509Certificate) cert).checkValidity(); 
        System.out.println("Certificate is active for current date"); 

       } catch (CertificateExpiredException cee) { 
        System.out.println("Certificate is expired"); 
       } 
      } else { 
       System.err.println("Unknown certificate type: " + cert); 
      } 
     } 
    } 
} 
+0

このコードはデジタル署名を実行しません。あなたはブラウザではなく、SSLサーバの証明書の公開部分を読んでいます。また、公開鍵でない秘密鍵が必要です – pedrofb

+0

可能であれば助けてください。このタスクはまだ取り消されています。 –

+0

現在、Java(http://stackoverflow.com/a/37421135/6371459)のブラウザサポートが不足しているため、これを行うことはできません。 javascriptまたはchrome messaging api経由で接続されたローカルアプリケーションを使用するか、WebCryptographyApiを使用してユーザー証明書を読み込むなどの回避策があります。 http://security.stackexchange.com/a/140204/112160を参照してください。 – pedrofb

関連する問題