2016-04-22 15 views
0

私はx.509証明書について自分自身を教えるために、以下のこのコードで作業しています。私の質問は、どこか他の場所に証明書やストアファイルを生成してから、プロジェクトにファイルを添付することになっていますか?または、プロジェクトでは、このすべてをプログラムで生成する予定ですか?私のエラーは、ストアファイルを見つけることができないということです。x.509 Cert - ストアファイルの生成方法は?

+0

私はあなたの証明書が何であるか分かりませんが、JVMがファイルを見つけることができないため、取得しているエラーは単純に起こっています。解決方法には、クラスパスに対する相対パスの指定、またはファイルへの完全なファイルシステムパスの指定が含まれます。 –

+0

ええ。私はこのプログラムが私のためにストアファイルを生成するはずか、何とかストアファイルを作成する必要があるかどうかはわかりません。私はトピックに新しいので、私は少し失われています。 – RockOn

答えて

1

これら2つのプログラムは、基本的に、証明書とキーストアがすでに作成されており、名前がuser.storecrypt.cerであり、これらの2つのファイルがプログラムがインストールされているフォルダにあると想定しています。

これらのファイルを生成するには、Javaディストリビューションのkeytoolを使用してキーストアと証明書を作成し、そこからパブリック証明書をエクスポートすることができます。ここで


は、ステップバイステップのサーバーを何です:

int port = 7999; 
ServerSocket server = new ServerSocket(port); 
Socket s = server.accept(); 
ObjectInputStream is = new ObjectInputStream(s.getInputStream()); 

サーバーがポート7999上のリスニングソケットを開き、一部のコンテンツを期待しています。

//Read the keystore and retrieve the server's private key 
//Default keystore is jks 
KeyStore ks = KeyStore.getInstance("jks"); 
ks.load(new FileInputStream("user.store"), password); 
PrivateKey dServer = (PrivateKey)ks.getKey(aliasname, password); 

は、それはあなたのプログラムをlauchedどこへuser.store(相対ファイルと呼ばれるファイルにあるキーストアを取得します。そのキーストアから、それはその別名で秘密鍵を取得し、あなたのケースでaliasname"user")。

//Decrypt: server's private key 
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
byte[] in = (byte[]) is.readObject(); 
cipher.init(Cipher.DECRYPT_MODE, dServer); 
byte[] plaintText = cipher.doFinal(in); 
System.out.println("The plaintext is: " + new String(plaintText)); 
server.close(); 

これは、クライアントのために今すぐ(通常はコンソール)

を秘密鍵を使用してコンテンツをソケットに送る解読して、標準出力に印刷:

String host = "localhost"; 
int port = 7999; 
Socket s = new Socket(host, port); 

ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream()); 

それは、ポート上のソケットに接続し7999

//Client loads server's cert 
InputStream inStream = new FileInputStream("crypt.cer"); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); 

はその後、それは証明書の有効性をチェックする(再び相対)ファイルcrypt.cerからサーバーのパブリック証明書を取得します。

//Get public key from cert 
RSAPublicKey eServer = (RSAPublicKey) cert.getPublicKey(); 

//Encrypt with RSA as key generation algorithm 
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, eServer); 
byte[] cipherText = cipher.doFinal(message.getBytes()); 
System.out.println("Ciphertext: " + cipherText); 
os.writeObject(cipherText); 
os.flush(); 
os.close(); 
s.close(); 
input.close(); 

これは、メッセージ(ユーザーが入力したもの)を暗号化してサーバーに送信します。

+0

ありがとう!私はあなたがそれぞれの部分を私にどのように説明したか本当に感謝しています。今はもっと意味をなさない。 – RockOn

+0

さて、私は鍵と証明書を作った。それはこの時点まで働きます。 RSAPublicKey eServer =(RSAPublicKey)cert.getPublicKey(); ' – RockOn

+0

正確なエラーメッセージは何ですか? crypt.cerファイルには何がありますか? –

関連する問題