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

관련 정보