0

.pubファイルの内容を にPublicKey変換してから に変換しPublicKeyString、変換が機能しているかどうかを判断し、プロセスでキーを変更しようとしています。

id_rsa.pub :

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zszKhcZTC8xJidUszmRn4Tr/FxPs04wpCzEstebfTW7Bvqgtt+OdvxoNyYM0LAEnxEF4XhAWcsX7VJJqstZLpDqlKDXFr2d0aVIjksCpZt+ftVRwYHRoERhEOP/UmPFb5rKIkhQbED2kTWg11mW9soc6BhwB3THn/Cyo3t1u2vWjEySgPhKeA3Xzh+5eqV7CUD8V6S7OAT7T9ijf7sRV0R8rwHgTLWJ8+dETnY3L3N0fEaNuaayeNblHqrL53/1+tsBBUF3bAS+1GE6oniSeM/yhtfzf2x+O5MDlVVMbOCC/v+FnfIIEKLA+v1xDSAha7C5cHh82TxToWXsbjqGD me@mail

Converter.java

public static final synchronized PublicKey base64ToPublicKey(final String algorithm, final String base64) throws GeneralSecurityException, IOException {
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] sigBytes2 = decoder.decodeBuffer(base64);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes2);
        KeyFactory keyFact = KeyFactory.getInstance(algorithm, "BC");
        return keyFact.generatePublic(x509KeySpec);
    }

    public static final synchronized String publicKeyToBase64(final PublicKey publicKey) throws GeneralSecurityException, IOException {
        byte[] publicKeyBytes = publicKey.getEncoded();
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(publicKeyBytes);
    }

私が実行すると:

PublicKey test1 = base64ToPublicKey("RSA", "AAAAB3NzaC1yc2EAAAADAQABAAABAQC0zszKhcZTC8xJidUszmRn4Tr/FxPs04wpCzEstebfTW7Bvqgtt+OdvxoNyYM0LAEnxEF4XhAWcsX7VJJqstZLpDqlKDXFr2d0aVIjksCpZt+ftVRwYHRoERhEOP/UmPFb5rKIkhQbED2kTWg11mW9soc6BhwB3THn/Cyo3t1u2vWjEySgPhKeA3Xzh+5eqV7CUD8V6S7OAT7T9ijf7sRV0R8rwHgTLWJ8+dETnY3L3N0fEaNuaayeNblHqrL53/1+tsBBUF3bAS+1GE6oniSeM/yhtfzf2x+O5MDlVVMbOCC/v+FnfIIEKLA+v1xDSAha7C5cHh82TxToWXsbjqGD");

私は戻ってきます:

java.security.spec.InvalidKeySpecException: java.io.IOException: unexpected end-of-contents marker
    at org.bouncycastle.jce.provider.JDKKeyFactory.engineGeneratePublic(Unknown Source)
    at org.bouncycastle.jce.provider.JDKKeyFactory$RSA.engineGeneratePublic(Unknown Source)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:328)
    at base64ToPublicKey(Converter.java:216)
    at main(Converter.java:283)
4

1 に答える 1

0

SSH2 のOpenSSH 公開鍵ファイル(およびid_*.pubのエントリも) は、SSH 固有の形式の OpenSSH 固有のバリアントを使用します。rfc4716を参照してください。これは、(リンクされているように) SSH2 ワイヤー形式に基づいています。 X.509' 形式の Java 暗号は、 . (SSH1 の OpenSSH ファイル形式は異なっていましたが、SSH1 は長く壊れており、使用すべきではありません。)known_hostsauthorized_keys

これを Java で変換するには、convert openSSH rsa key to javax.crypto.Cipher compatible format を参照してください。

問題を回避する方が簡単です。

バイパス 1:かなり最近の OpenSSH を使用している場合 (6.0 は問題ありませんが、以前の場合はわかりません)、次を使用します。

ssh-keygen -e -m PKCS8 -f id_rsa.pub >pub.pem # change filename as needed

PEM形式の「X.509」(実際にはSubjectPublicKeyInfo別名SPKI)に変換します。(はい、彼らは SPKI を意味するために PKCS8 という名前を使用しています。それはクレイジーです。)次に、BEGIN と END の行を破棄して Java でこれを読み取り、base64 から までの間(改行を除く)のすべてをデコードし、あなたが持っているようbyte[]にそれを入れますX509EncodedKeySpec今。または、OpenSSL を使用している場合は、DER 形式に変換できます

openssl rsa -pubin -in pub.pem -out pub.der -outform der # any version
openssl pkey -pubin -in pub.pem -out pub.der -outform der # 1.0.0 up

次に、DER ファイルをまったく変更せずに読み込み、X509EncodedKeySpec.

バイパス 2:秘密鍵を持っていて、それが OpenSSH の「新しい」形式 (6.5 (編集) 以降はオプションで、7.8 以降はデフォルト) ではなく、OpenSSL を持っている場合は、SPKI (Java フレンドリー) 形式で公開鍵を取得します。の一つ

openssl rsa -in id_rsa -pubout -out pub.pem # default PEM
openssl rsa -in id_rsa -pubout -out pub.der -outform der # DER
openssl pkey -in id_rsa -pubout -out pub.pem # default PEM, 1.0.0 up
openssl pkey -in id_rsa -pubout -out pub.der -outform der # DER, 1.0.0
于 2016-08-23T18:58:44.727 に答える