如何使用 java 为 tor 洋葱服务生成有效的私钥 (RSA 1024)?
How generate a valid private (RSA 1024) key for a tor onion service using java?
我正在尝试为 java 中的 tor onion 服务生成一个有效的私钥。使用这个私钥,我想获得一个有效的.onion 地址。
我有 运行 下面代码的各种组合(有这个 bit/without 那个位)
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKeyGenerated = keyPair.getPrivate();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyGenerated.getEncoded()));
Base64.Encoder encoder = Base64.getEncoder();
String privateKeyEncoded = encoder.encodeToString(privateKey.getEncoded());
String fileName = "{{where I'm wanting to store the file}}";
Writer writer = new FileWriter(fileName);
writer.write("-----BEGIN RSA PRIVATE KEY-----\n");
writer.write(privateKeyEncoded);
writer.write("\n-----END RSA PRIVATE KEY-----\n");
writer.close();
生成后,我将密钥复制到我的 /var/lib/tor/hidden_service/private_key,删除所有关联的 hostname 并启动 tor 服务。在日志中我得到错误:
TLS error: wrong tag (in asn1 encoding routines:ASN1_CHECK_TLEN:---)
TLS error: nested asn1 error (in asn1 encoding routines:ANS1_D2I_EX_PRIMITIVE:---)
TLS error: nested asn1 error (in asn1 endoding routines:ASN1_TEMPLATE_NOEXP_D2I:---)
TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)
如果生成了生成的 .onion 地址,则它不起作用。
如何生成有效的私钥?
解决方法:将BEGIN RSA PRIVATE KEY
改为BEGIN PRIVATE KEY
Java 以 PKCS#8 格式对密钥进行编码
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyGenerated.getEncoded()));
但是您正在生成一个带有 header -----BEGIN RSA PRIVATE KEY-----
的 PEM 文件,该文件保留给 PKCS#1 密钥(旧格式但很常见),并且 .onion 假设它是 pkcs1 时它真的是 pkcs8。查看错误
TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)
所以你需要使用 PCKS#8 header -----BEGIN PRIVATE KEY-----
另请参阅此 post Load a RSA private key in Java (algid parse error, not a sequence)
我正在尝试为 java 中的 tor onion 服务生成一个有效的私钥。使用这个私钥,我想获得一个有效的.onion 地址。
我有 运行 下面代码的各种组合(有这个 bit/without 那个位)
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKeyGenerated = keyPair.getPrivate();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyGenerated.getEncoded()));
Base64.Encoder encoder = Base64.getEncoder();
String privateKeyEncoded = encoder.encodeToString(privateKey.getEncoded());
String fileName = "{{where I'm wanting to store the file}}";
Writer writer = new FileWriter(fileName);
writer.write("-----BEGIN RSA PRIVATE KEY-----\n");
writer.write(privateKeyEncoded);
writer.write("\n-----END RSA PRIVATE KEY-----\n");
writer.close();
生成后,我将密钥复制到我的 /var/lib/tor/hidden_service/private_key,删除所有关联的 hostname 并启动 tor 服务。在日志中我得到错误:
TLS error: wrong tag (in asn1 encoding routines:ASN1_CHECK_TLEN:---)
TLS error: nested asn1 error (in asn1 encoding routines:ANS1_D2I_EX_PRIMITIVE:---)
TLS error: nested asn1 error (in asn1 endoding routines:ASN1_TEMPLATE_NOEXP_D2I:---)
TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)
如果生成了生成的 .onion 地址,则它不起作用。
如何生成有效的私钥?
解决方法:将BEGIN RSA PRIVATE KEY
改为BEGIN PRIVATE KEY
Java 以 PKCS#8 格式对密钥进行编码
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyGenerated.getEncoded()));
但是您正在生成一个带有 header -----BEGIN RSA PRIVATE KEY-----
的 PEM 文件,该文件保留给 PKCS#1 密钥(旧格式但很常见),并且 .onion 假设它是 pkcs1 时它真的是 pkcs8。查看错误
TLS error: RSA lib (in rsa routines:OLD_RSA_PRIV_DECODE:---)
所以你需要使用 PCKS#8 header -----BEGIN PRIVATE KEY-----
另请参阅此 post Load a RSA private key in Java (algid parse error, not a sequence)