OpenSSL自己署名証明書の一般名の長さが64バイトを超えています。

OpenSSL自己署名証明書の一般名の長さが64バイトを超えています。

次のように、openSSLを使用して自己署名証明書を作成できます。

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX -nodes

インターフェイスは何とか私の一般名を64バイトに制限します。 64バイトより長い一般名を持つ証明書を作成するにはどうすればよいですか?

答え1

「これをしないでください。標準に違反しています」という答えはすべて、私が知っている限り非常に役に立ちません。なぜなら、リバースエンジニアリングの課題の一環としてこれを行う必要があるからです。私が知る限り、標準に違反したという事実は重要ではありません。

(おおよそ)ステップは次のとおりです。

  1. 以下からlibresslの最新ソースコードをダウンロードしてください。https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/(私はmacOS Mojaveに付属のバージョン2.6.0を使用しています)
  2. /tar/gzを解凍し、目的の/crypto/asn1/a_mbstr.cエディタで開きます。
  3. 次のようなコンテンツを検索してください。

    if ((maxsize > 0) && (nchar > maxsize)) {
        ASN1error(ASN1_R_STRING_TOO_LONG);
        ERR_asprintf_error_data("maxsize=%ld", maxsize);
        return -1;
    }
    

    そしてコメントをつけてください。バージョン2.6.0の場合は155-159行です。この行を削除すると、最大CN長チェックが削除されます。

  4. ファイルの指示に従ってREADMEバイナリをビルドします。 macOSでビルドするときは、YMMV以外のライブラリをインストールする必要はありません。私はcmakeそれを使用して新しいopensslバイナリを/build/apps/openssl

  5. コマンドラインフラグを使用してCSRを生成します(読み取り:インタラクティブツールではありません。特別なチェックがありますが、この修正はそのチェックにパッチを適用しません!)。

    たとえば、

    /build/apps/openssl/openssl req -new -newkey rsa:2048 -nodes -out a.csr -keyout a.key -subj "/CN=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
    
  6. opensslストックバイナリ(または必要に応じて変更されたバイナリ)を使用してCSRに署名します。

    openssl x509 -req -in a.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out a.crt -days 500 -sha256
    

その後、素晴らしい非準拠証明書を使用する準備が整いました。 64文字より長いCNを持つ証明書を使用するときに多くの問題があることがわかりましたが(Wiresharkが解剖学的ディスプレイからCNを切断するなど)、実際には私の要件に適しています。

答え2

あなたはできません。

これ最大制限を指定64です:

- 天井の仕様は必須と見なされるべきです。

- ITU-T X.411 MTSパラメータ参照定義の付録Bからの抜粋

- 上限

- 上限

ub 名前 INTEGER ::= 32768

ub 一般名 INTEGER ::= 64

サブ場所名 INTEGER ::= 128

ub 状態名 INTEGER ::= 128

ub 組織名 INTEGER ::= 64

答え3

Allisonの優れた回答に加えて、他の証明書生成ツールはopensslのようにこのCN制限に常に従うわけではないことを発見しました。

例:Golangを使用してCNを必要なだけ長く設定できる、簡単な自己署名証明書とキー生成スクリプトを作成しました。

私の解決策は次のとおりです。ブラウザで実行するか、コードをコピーしてローカルで変更して実行できます。https://go.dev/play/p/GbdoV0UEmFb

このコードはキーを生成し、証明書に署名し、PEM形式で出力に印刷します(このスレッドで使用されているopensslコマンドに似ています)。重要な用途に使用を検討している場合は、レビューをよくお読みください。以下は、opensslを使用してこのスクリプトで生成された証明書を読み取ったときの長いCNの証拠です。

$ openssl x509 -text -noout -in playground.crt | head -n 11
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            a8:fd:bf:b8:f3:f9:85:09:36:28:89:fa:65:27:33:ed:19:08
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = MY REALLY LONG COMMON NAME THAT IS DEFINITELY LONGER THAN 64 CHARACTERS
        Validity
            Not Before: Nov 10 23:00:00 2009 GMT
            Not After : Nov 10 23:00:00 2010 GMT
        Subject: CN = MY REALLY LONG COMMON NAME THAT IS DEFINITELY LONGER THAN 64 CHARACTERS

関連情報