AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 778504
Accepted
David Tonhofer
David Tonhofer
Asked: 2024-06-17 23:19:57 +0800 CST2024-06-17 23:19:57 +0800 CST 2024-06-17 23:19:57 +0800 CST

Provavelmente um nit: "openssl x509" exibe o número de série às vezes como string de octeto, às vezes como número inteiro

  • 772

Percebi que openssl x509 -in $FILE -textàs vezes exibe o número de série de um certificado X.509 (um número inteiro positivo de até 20 bytes, portanto o bit mais significativo em 0), às vezes como uma "string de octetos" e às vezes como um número inteiro com sua representação hexadecimal a seguir.

Por exemplo, aqui está o número de série de um certificado na cadeia "Letsencrypt" (número de série de 16 bytes, mas o MSB é 1, algo está errado?):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            91:2b:08:4a:cf:0c:18:a7:53:f6:d6:2e:25:a7:5f:5a
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1

Aqui está um certificado do "pacote de certificados" do sistema (número de série de 8 bytes, MSB é 0)

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 6828503384748696800 (0x5ec3b7a6437fa4e0)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=ACCVRAIZ1, OU=PKIACCV, O=ACCV, C=ES

Outro do mesmo pacote (número de série de 16 bytes, MSB é 0):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA

O certificado QuoVadis Root CA 2(número de série de 2 bytes):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1289 (0x509)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=BM, O=QuoVadis Limited, CN=QuoVadis Root CA 2

Aqui está um com número de série de 9 bytes (MSB corretamente em 0):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            11:00:34:b6:4e:c6:36:2d:36
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=RO, O=CERTSIGN SA, OU=certSIGN ROOT CA G2

E um do mesmo provedor, um certificado com número de série de 6 bytes:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 35210227249154 (0x200605167002)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RO, O=certSIGN, OU=certSIGN ROOT CA

Parece bastante aleatório. Existe um significado particular em haver duas maneiras de imprimir o número de série?

openssl
  • 1 1 respostas
  • 794 Views

1 respostas

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2024-06-18T00:09:29+08:002024-06-18T00:09:29+08:00

    É apenas uma escolha estilística na forma como openssl x509 -textos números de série são impressos. A lógica no código-fonte é:

    • Se o número de série for pequeno, imprima-o como um número decimal e hexadecimal, com início -para números negativos.
    • Se o número de série for grande, imprima-o como uma lista de blocos de dois dígitos hexadecimais separados por dois pontos, com um final (Negative)para números negativos.

    O que determina pequeno versus grande é o valor absoluto do número de série: um número de série pequeno é estritamente menor que 2 ^ 63 em um sistema de 64 bits ou 2 ^ 31 em um sistema de 32 bits ( sizeof(long)sendo o que importa).

    O “número de série” deveria realmente ser uma string de octeto, já que é apenas um identificador único e nunca é usado como um número. Mas foi especificado como um número inteiro na sintaxe X.509 há muito tempo, portanto é codificado como um número inteiro. A sintaxe permite que seja um número inteiro negativo, mas a semântica proíbe isso. Por outro lado, a sintaxe evita números de série que diferem apenas no número de zero octetos iniciais.

    bit mais significativo em 0

    Não exatamente. RFC 5280 é ambíguo: diz “Usuários de certificados DEVEM ser capazes de lidar com valores serialNumber de até 20 octetos”, mas um número de série é um INTEGER, não uma OCTET STRING, e um INTEGER não possui uma contagem de octetos. Existem duas interpretações plausíveis:

    • Isso pode significar que o valor (positivo) deve caber em 20 octetos, portanto, o número inteiro está entre 1 e (2^8)^20-1 = 2^160-1.
    • Isso pode significar que a carga útil da codificação do número inteiro (incluindo o bit de sinal) deve caber em 20 octetos, portanto, o número inteiro está entre 1 e (2^8)^20/2-1 = 2^159-1.

    De acordo com a segunda interpretação, o bit mais significativo do valor de 20 octetos deve ser 0. É perfeitamente normal ter, por exemplo, um número de série entre (2^8)^16/2 e (2^8)/16- 1, como no certificado Letsencrypt assinado por ISRG Root X1.

    Você provavelmente está interpretando mal as restrições nas codificações de um INTEGER como restrições no valor. Na codificação de um INTEGER, o bit superior do primeiro octeto é um bit de sinal. Isso significa que o número de série 0x912b084acf0c18a753f6d62e25a75f5a é codificado como

    021100912b084acf0c18a753f6d62e25a75f5a
    ^^ type
      ^^ length
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ value (with top bit = 0 for non-negative)
    

    e não

    0210912b084acf0c18a753f6d62e25a75f5a
    ^^ type
      ^^ length
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ value (with top bit = 1 for negative)
    

    que seria - 2 ^ 128 + 0x912b084acf0c18a753f6d62e25a75f5a = -0x6ed4f7b530f3e758ac0929d1da58a0a6. Você pode ver a codificação com openssl asn1 -dump ….

    • 12

relate perguntas

  • openssl -showcerts com -servername fornece âncora/raiz errada?

  • openssl 'genpkey -algorithm RSA' vs. 'genrsa'

  • Verifique manualmente o resumo da mensagem S/MIME

  • Como usar o pv para mostrar o progresso da criptografia/descriptografia do openssl?

  • Confuso sobre o sal no arquivo de criptografia openssl

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve