作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我正在使用下面的代码来自学 x.509 证书。我的问题是,我是否应该在其他地方生成证书或存储文件,然后将文件附加到项目中?或者该项目应该在程序中生成所有这些内容吗?我的错误是找不到商店文件。
最佳答案
基本上,这两个程序期望已创建证书和 keystore ,名称为 user.store
和 crypt.cer
,并且这两个文件位于启动程序的文件夹。
要生成这些文件,您可以使用 Java 发行版中的 keytool
创建 keystore 和证书,然后从中导出公共(public)证书。
以下是服务器逐步执行的操作:
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);
它获取位于名为 user.store
的文件(与您启动程序的位置相对的文件)中的 keystore 。从该 keystore 中,它获取别名为 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
获取服务器的公共(public)证书(同样是相对的)然后,它检查证书的有效性。
//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();
这会加密消息(用户输入的)并将其发送到服务器。
关于java - x.509 证书 - 如何生成存储文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36785592/
我是一名优秀的程序员,十分优秀!