
Se um dos principais objetos da infraestrutura de chave pública (PKI) for certificados X509, o assunto central da PKI serão as Autoridades de Certificação (CAs). É a CA que emite certificados, encerra sua validade (revogação de certificado), confirma sua validade. Nas páginas do
Habrahabr, você pode encontrar várias publicações sobre a emissão de certificados digitais usando o
OpenSSL .
Basicamente, esses artigos discutem o uso
do utilitário openssl , descrevem sua interface de linha de comando e trabalham com arquivos que armazenam tudo: chaves, solicitações, certificados, incluindo a raiz, etc. Porém, se você desenvolver um CA (centro de certificação) completo baseado no OpenSSL, é natural querer se livrar dessa variedade de arquivos e passar a trabalhar com bancos de dados, além de ter uma interface gráfica para emitir e gerenciar certificados. E se você se lembra da Lei Federal de 6 de abril de 2011. No. 63- Nas assinaturas eletrônicas, é necessário que a CA cumpra os requisitos desta lei, bem como os requisitos para o formulário de um certificado qualificado para uma chave de verificação de assinatura eletrônica, aprovada pela Ordem do Serviço de Segurança Federal da Rússia de 27 de dezembro de 2011 no 795.
Os cidadãos comuns têm a impressão de que as UTs são algo enorme (bem, o Centro, quase como o Centro de Controle de Missões).

Do ponto de vista da responsabilidade da CA - é exatamente isso. Afinal, os certificados emitidos pela CA são realmente iguais no passaporte hoje.
Do ponto de vista de um programador, nem tudo é tão assustador. Assim, o projeto do centro de certificação CAFL63 nasceu. A implementação do projeto CAFL63 é baseada em três "pilares", a saber, OpenSSL,
SQLite3 e
Tcl / Tk .
Então, o que é uma autoridade de certificação hoje? Em primeiro lugar, é o Centro de Registro, onde representantes de pessoas jurídicas, indivíduos e empreendedores individuais solicitam certificados com um pacote de documentos necessários, em particular, identificando a identidade e a autoridade do solicitante. Eles podem vir com aplicativos prontos eletronicamente. O CR verifica os documentos, a solicitação (dados preenchidos, a exatidão da assinatura eletrônica etc.) e, se tudo correu bem, eles aceitam a solicitação, a aprovam e a enviam para o Centro de Certificação (CA). Mas isso é ideal. Na prática, tudo parece diferente.
Cidadãos, as organizações precisam de um certificado (para acesso ao portal dos Serviços de Estado, para declaração de impostos, para licitação), mas não sabem o que é e o que fazer com ele. Eles estão sinceramente convencidos de que a CA recebe uma assinatura eletrônica como um fac-símile. Mas esses são problemas de iluminação. Portanto, os candidatos vêm à Administração Central da Administração Central e apresentam documentos. Juntamente com o funcionário do Escritório Central, eles vão para um local de trabalho separado e
preparam uma solicitação de certificado:

Uma solicitação preparada em mídia eletrônica, como já mencionado, é recebida pelo CR. O que o candidato precisa se lembrar? Em primeiro lugar, pegue a mídia com a chave privada criada!
Uma solicitação aprovada em mídia eletrônica é transmitida à CA, onde um certificado será emitido em sua base.
Este é um diagrama esquemático do trabalho da CA. Os detalhes ficarão claros abaixo. Uma observação, para conveniência da demonstração, o utilitário para preparar uma solicitação, CR e CA são combinados em um complexo de demonstração. Mas não há problemas com a diversidade funcional. O mais simples deles é ter uma instância CAFL63 em cada local de trabalho e usar apenas a funcionalidade necessária.
Quando o projeto estava em pleno andamento, o projeto
SimpleCA chamou minha atenção. O estudo deste projeto ajudou muito na implementação final do CAFL63 CA.
O código fonte do utilitário e suas distribuições para plataformas Linux e MS Windows podem ser encontrados
Portanto, execute o utilitário CAFL63 e a página inicial aparece na tela:

Começamos o trabalho pressionando a tecla "Criar banco de dados". O banco de dados da CA é criado usando o DBMS entre plataformas do
SQLite3 . O banco de dados da CA contém várias tabelas. A tabela principal mainDB contém apenas um registro, que armazena o certificado raiz, a chave privada criptografada com uma senha e as configurações da CA. Há duas tabelas relacionadas às solicitações de certificado: solicitações atuais do reqDB e arquivamento de solicitação do reqDBArc. Três tabelas são criadas para certificados: a tabela de novos certificados certDBNew, a tabela do arquivo de certificados certDB e a tabela de certificados revogados certDBRev:
. . . certdb eval {create table certDB( ckaID text primary key , nick text, sernum text, certPEM text, subject text, notAfter text, notBefore text, dateRevoke text, state text )} certdb eval {create table certDBRev( ckaID text primary key )} certdb eval {create table certDBNew( ckaID text primary key )} certdb eval {create table reqDB (ckaID text primary key, nick text, sernum text, subject text, type text, datereq text, status text, reqpem text, pkcs7 text)} certdb eval {create table reqDBAr (ckaID text primary key, nick text, sernum text, subject text, type text, datereq text, status text, reqpem text, pkcs7 text)} certdb eval {create table crlDB(ID integer primary key autoincrement, signtype text, issuer text, publishdate text, nextdate text, crlpem text)} . . .
Todas as tabelas de solicitação e certificado usam
o valor de hash (sha1) da chave pública como chave (chave primária). Por conveniência, no futuro, o valor do hash do valor da chave pública será chamado CKAID (terminologia PKCS # 11). Isso se mostrou muito conveniente, por exemplo, ao procurar um certificado mediante solicitação ou vice-versa. Há outra tabela crlDB no banco de dados que armazena listas de certificados revogados.
O valor da chave pública é armazenado na solicitação e no certificado. Portanto, antes de colocá-los no banco de dados, você deve extrair a chave pública deles e calcular o CKAID. Para extrair o valor da chave pública, é conveniente usar o pacote pki (o pacote exige pki), que contém ferramentas para trabalhar com certificados e solicitações. No entanto, este pacote não foi projetado para funcionar com criptografia russa. Nesse sentido, com base nos procedimentos parse_cert e parse_csr incluídos no pacote pki, escreva os procedimentos parceiros_cert_gost e parse_csr_gost:
... ## Convert Pubkey type to string set pubkey_type [::pki::_oid_number_to_name $pubkey_type] # Parse public key, based on type switch -- $pubkey_type { "rsaEncryption" { set pubkey [binary format B* $pubkey] binary scan $pubkey H* ret(pubkey) ::asn::asnGetSequence pubkey pubkey_parts ::asn::asnGetBigInteger pubkey_parts ret(n) ::asn::asnGetBigInteger pubkey_parts ret(e) set ret(n) [::math::bignum::tostr $ret(n)] set ret(e) [::math::bignum::tostr $ret(e)] set ret(l) [expr {int([::pki::_bits $ret(n)] / 8.0000 + 0.5) * 8}] set ret(type) rsa } "1.2.643.2.2.19" - "1.2.643.7.1.1.1.1" - "1.2.643.7.1.1.1.2" { # gost2001, gost2012-256,gost2012-512 set pubkey [binary format B* $pubkey] binary scan $pubkey H* ret(pubkey) set ret(type) $pubkey_type ::asn::asnGetSequence pubkey_algoid pubalgost #OID - ::asn::asnGetObjectIdentifier pubalgost oid1 #OID - ::asn::asnGetObjectIdentifier pubalgost oid2 } default { error "Unknown algorithm" } } ...
Diferentemente dos procedimentos "nativos", eles permitem que você trabalhe com objetos não apenas no formato PEM, mas também no formato DER. Para trabalhar com listas de revogação de certificados CRL, o procedimento parse_crl foi gravado. Todos esses procedimentos podem ser encontrados no código fonte, que é armazenado com a distribuição.
Também no pacote pki não há oid-s russo, por exemplo, TIN, SNILS, etc. Esse problema é facilmente resolvido adicionando oid-s russo ao array :: pki :: oids:
. . . set ::pki::oids(1.2.643.100.1) "OGRN" set ::pki::oids(1.2.643.100.5) "OGRNIP" set ::pki::oids(1.2.643.3.131.1.1) "INN" set ::pki::oids(1.2.643.100.3) "SNILS" # set ::pki::oids(1.2.643.2.2.3) " 34.10-2001" set ::pki::oids(1.2.643.7.1.1.3.2) " 34.10-2012-256" set ::pki::oids(1.2.643.7.1.1.3.3) " 34.10-2012-512" . . .
Tendo as funções parse_cert_gost e parse_csr_gost, os valores de CKAID (chave primária para o banco de dados) são calculados da seguinte maneira:
. . . array set b [parse_csr_gost $req] set pem $b(pem) set subject $b(subject) set pubkey $b(pubkey) set key1 [binary format H* $pubkey] set ckaID [::sha1::sha1 $key1] . . .
Então, clique no botão "Criar banco de dados":

A criação da CA começa com a escolha do diretório no qual armazenaremos as configurações de banco de dados e senha para acessar a chave privada da CA. O utilitário CAFL63 monitora cuidadosamente o tamanho da senha:

A senha é armazenada no banco de dados da CA como um hash:
. . . set hash256 [::sha2::sha256 $wizData(capassword)] . . .
Depois de pressionar a tecla “Rastrear”, o processo de formação de um certificado raiz autoassinado da CA implantada é iniciado. Na primeira etapa deste processo, o tipo e os parâmetros do par de chaves são selecionados:

Depois de escolher o par de chaves para o certificado raiz do centro de certificação criado, continuamos a preencher o formulário com informações sobre o proprietário (a primeira captura de tela está faltando).
Observe que o utilitário CAFL63 possui uma certa “inteligência” e, portanto, controla não apenas a disponibilidade de dados nos campos, mas também a correção (destaque vermelho - incorreto) do preenchimento de campos como TIN, PSRN, SNILS, PSRNIP, endereço de email, etc .:

Depois de preencher os campos com informações sobre o proprietário da CA, ela será oferecida para determinar as configurações do sistema da CA:

Se você não trabalhar com criptografia russa, poderá usar o OpenSSL usual. Para trabalhar com criptografia russa, você deve selecionar a versão apropriada, uma modificação do OpenSSL. Para mais detalhes, leia README.txt na distribuição baixada. Como está planejado emitir certificados qualificados, também é necessário fornecer informações sobre a certificação da própria CA e o sistema de proteção de informações criptográficas usado por ela (consulte “Requisitos para o formulário de certificado qualificado de uma chave de verificação de assinatura eletrônica”, aprovado pela Ordem do Serviço de Segurança Federal da Rússia de 27 de dezembro de 2011, nº 795).
Depois de preencher corretamente todos os campos, mais uma vez, será oferecido para verificar a precisão e clicar no botão "Concluir":

Após clicar no botão "Concluir", o banco de dados da CA será criado no qual o certificado raiz da CA, a chave privada, as configurações do sistema serão salvas e a página inicial do utilitário CAFL63 será exibida na tela novamente. Agora que criamos o banco de dados da CA recém-criada, clicamos no botão "Abrir banco de dados", selecionamos o diretório com o banco de dados, vamos para a janela principal de trabalho da CA e clique no botão "Exibir CA CA", verifique se o certificado raiz que criamos :

O próximo passo é preparar modelos / perfis de aplicativos para entidades legais, indivíduos e empreendedores individuais (
Ferramentas-> Configurações-> Tipos de Certificados-> Novo ):

Após especificar o nome do novo perfil, será proposto determinar sua composição:

A composição do perfil é determinada pelo nome distinto. Cada perfil possui sua própria composição com campos / oids obrigatórios (obrigatórios) ou não. A composição do perfil para pessoas jurídicas, indivíduos e empreendedores individuais é determinada pelos requisitos da Lei Federal 63 e pelo FSB da Rússia "Requisitos para o formulário de certificado qualificado de um certificado de chave de verificação de assinatura eletrônica".
Depois de preparar os perfis, a CA está pronta para receber solicitações e solicitações deles. Como observado acima, o requerente pode vir com ou sem uma solicitação pronta para um certificado.
Se o requerente veio com um aplicativo pronto, depois de verificar seus documentos, o aplicativo é importado para o banco de dados da CA. Para fazer isso, selecione a guia "Solicitações de certificados" na janela principal de trabalho, clique no botão "Solicitação de importação / CSR" e selecione o arquivo com a solicitação. Depois disso, uma janela com informações sobre a solicitação será exibida:

Após revisar a solicitação e verificar se ela foi preenchida corretamente, você pode clicar no botão "Importar" para inseri-la no banco de dados. Imediatamente, observamos que quando você tenta refazer uma solicitação no banco de dados da CA, uma mensagem será exibida:

As solicitações no banco de dados da CA são marcadas (coluna "Tipo") como "Localidade" criada no centro de registro da CA ou como "Importação" criada pelo próprio solicitante, e o horário de recebimento do aplicativo na CA também é registrado. Isso pode ser útil na resolução de situações de conflito. Portanto, ao importar uma solicitação de certificado, você deve indicar quem criou a solicitação (consulte a captura de tela).
O aplicativo importado está localizado no banco de dados da CA e é exibido na janela principal na guia "Solicitações de certificado". As solicitações recebidas estão no estágio "consideração" (a coluna "Status" das guias "Solicitações de certificado" e "Arquivos de solicitação"). Para cada solicitação recém-recebida, uma decisão deve ser tomada (menu suspenso quando você clica com o botão direito do mouse na solicitação selecionada):

Cada solicitação deve ser rejeitada ou aprovada:

Se a solicitação for rejeitada, ela será movida da tabela de solicitações reqDB atuais para a tabela do archive de solicitações reqDBArc e, consequentemente, desaparecerá na guia "Solicitações de certificado" e aparecerá na guia "Solicitar arquivamento".
O aplicativo aprovado permanece na tabela reqDB e na guia "Solicitações de certificado" até que o certificado seja emitido e, em seguida, também termina no arquivo morto.
Antes de emitir o certificado, é necessário esclarecer com o solicitante para que fins (por exemplo, para acessar o portal dos Serviços de Estado) o certificado será usado (
Ferramentas-> Configurações-> Tipos de Certificado -> Individual -> Editar -> Uso da Chave ):

Para emitir um certificado, você deve selecionar o aplicativo aprovado na guia "Solicitação de certificados", clicar com o botão direito do mouse e selecionar "Emitir certificado" no menu suspenso. No widget exibido, você precisará selecionar o perfil ao qual o perfil da solicitação / certificado deve corresponder:

Observe que, no processo de emissão de um certificado, você pode esclarecer os valores de um campo específico:

O procedimento para emitir um certificado em si (item de menu "Emitir um certificado") difere pouco do procedimento para criar um certificado raiz ou emitir um aplicativo:

O certificado emitido aparecerá imediatamente na guia Certificados. Nesse caso, o próprio certificado cai na tabela certDBNew do banco de dados da CA e permanece lá até ser publicado. Um certificado é considerado publicado após ser exportado para o dump SQL de novos certificados, que é transferido para um serviço público. A publicação de um certificado o move da tabela certDBNew para a tabela certDB.
Se você clicar com o botão direito do mouse na linha selecionada na guia "Certificados", um menu com as seguintes funções será exibido:

Essas funções permitem visualizar o certificado em si e a solicitação com base na qual foi emitido. Você também pode exportar o certificado para um arquivo ou para a unidade flash de um candidato. A função mais importante aqui é a função de revogação de certificado! Há um recurso tão exótico como exportar um certificado para um contêiner seguro PKCS # 12. É utilizado quando o requerente deseja receber esse recipiente. Para esses solicitantes, é especialmente fornecida uma função de geração de solicitação com o salvamento da chave privada em um arquivo (botão "Criar solicitação / CSR" na guia "Solicitações de certificado").
Então, a CA começou sua vida, emitiu o primeiro certificado. Um dos objetivos da CA é a organização do acesso livre aos certificados emitidos. A publicação de certificados geralmente passa por serviços da Web. O CAFL63 também possui este serviço:

Para publicar certificados e listas de certificados revogados em um serviço público, a CA pré-carrega os certificados em arquivos (
Certificados-> Exportar Certificados ) ou faz um despejo SQL de toda a tabela de certificados a partir da qual você pode criar um banco de dados de certificados e carregá-los nele, e depois executá-los. Despejo SQL de novos certificados dos quais eles serão adicionados ao banco de dados de serviço público:

A função fundamental de uma AC é publicar uma lista de certificados revogados, semelhante à maneira como o Ministério da Administração Interna faz com relação aos passaportes vencidos. O certificado pode ser revogado a pedido do proprietário. O principal motivo da revogação é a perda da chave privada ou a confiança nela.
Para revogar um certificado, selecione-o na guia "Certificados", clique com o botão direito do mouse e selecione o item de menu "Revogação de certificado":

O procedimento de revogação não é diferente do procedimento de aprovação de uma solicitação ou emissão de um certificado. O certificado revogado cai na tabela cerDBRev do banco de dados da CA e aparece na guia "Certificados revogados".
Resta considerar a última função da CA - o lançamento da CRL - uma lista de certificados revogados. A lista da CRL é formada na guia "Certificados revogados" quando você clica no botão "Criar SOS / CRL". Tudo o que é necessário para o administrador é digitar a senha da CA e confirmar sua intenção de emitir a CRL:

A CRL emitida cai na tabela crlDB do banco de dados e é exibida na guia CRL / SOS.
Para analisar a CRL antes de colocá-la no banco de dados, o procedimento parse_crl foi gravado:
proc parse_crl {crl} { array set ret [list] if { [string range $crl 0 9 ] == "-----BEGIN" } { array set parsed_crl [::pki::_parse_pem $crl "-----BEGIN X509 CRL-----" "-----END X509 CRL-----"] set crl $parsed_crl(data) } ::asn::asnGetSequence crl crl_seq ::asn::asnGetSequence crl_seq crl_base ::asn::asnGetSequence crl_base crl_full ::asn::asnGetObjectIdentifier crl_full ret(signtype) #puts "KEY_TYPE=$ret(signtype)" ::::asn::asnGetSequence crl_base crl_issue set ret(issue) [::pki::x509::_dn_to_string $crl_issue] #puts "ISSUE=$ret(issue)" ::asn::asnGetUTCTime crl_base ret(publishDate) ::asn::asnGetUTCTime crl_base ret(nextDate) #puts "publishDate=$ret(publishDate)" return [array get ret] }
Para visualizar a CRL ou exportá-la para publicação em um serviço público, você deve, como sempre, selecionar a linha desejada, clicar com o botão direito do mouse e selecionar o item de menu apropriado:

Isso é tudo, a Autoridade de Certificação está pronta.
Descubra como montar e conectar o OpenSSL à criptografia russa
aqui .