Formatando a mensagem criptografada do OpenSSL e a assinatura no mesmo arquivo de texto simples

0

Estou trabalhando no design de uma API que exige que mensagens criptografadas sejam assinadas e enviadas por TLS. O TLS é HTTP / SSL.

As mensagens em si são algumas centenas de Kb (no máximo) de dados JSON, criptografados com chaves assimétricas. A infra-estrutura da PK é resolvida por uma rede de confiança e as partes estão na mesma cidade, portanto podemos trocar chaves pessoalmente.

Não podemos confiar no GnuPG / PGP, pois o suporte da biblioteca nos idiomas que estamos usando é desconhecido, e preferimos usar diretamente o OpenSSL.

Queremos enviar, em um texto simples, o seguinte, a mensagem e sua assinatura. Com o GnuPG / PGP, isso pode parecer:


-----BEGIN PGP SIGNED MESSAGE-----
#
# Encrypted message data here...
#
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (MingW32)

iQIVAwUBPOCy1mM8BmRItYg4AQKWrA//fR5LKFyt+78CMtfpzkHgCVFyEe2ImsBy
FJ2HvzRIP4Bvor1iEOZ9A0fux8gBNXrvEtaDXSiGyXH+Ru4F3g1+K119fgBPRBgo
oOTbSLZSlRYWp8mRALsiWXKEHWgpy4zIHVTY6tPJdxFBZYJXnQj/4S6MRP+eJdam
rU8ufExxaqQPw+KCNEVCSk1yHZ886k6MTSa1oDqUOLiM1cBDCtD8Jv+BE0gLHPb9
1h7lEka8QGNe+P7iiUzvsuD7HCL6dGb6T70/KBBHIP6lDwOgUX3eTd8e+I3jczs9
RyEmd6G4swM3IzCD1km+SN5/k5QsMjd6Lw5fB95Mroi47QNpya8ifYbMgCg0+BVm
c7QOwr79+9cJiKhEICbMf5pKQWzP/AznaYlM0IOGGCvxa5loLl7BbtvktVMocitF
zWM9SB0kmSu3OlMxjXYcBsyHCHN4dTpCD9d1jfbgth9YV06sWpONLohdaWx+n9kO
CxsSDGI+aW8sGKHWonw0Uy4UAvUzY3tiZTzTF+FzoJzhy13KK1j4Y0MMx1jZ68f9
R9wSKVdiyXwuMXkWWK0uxSZuBz4mTofZ7YmFm7UdxOH4bMnO+rWNCSPR7md+X0j1
nQSwtxEnIu7Tucb/ZG3t9kR+KTByPTu7tHINr4HFd8m2Cu7Wi10TP/EBtXbtYA/1
SBaUXcbgCD8=
=Hn6O
-----END PGP SIGNATURE-----

No entanto, não consegui encontrar uma maneira adequada de fazer o mesmo com o OpenSSL. smime Pelo que entendi, não é adequado, pois não estamos enviando e-mails.

Os dois blocos em questão são:


$ openssl enc -base64 < minimum.json.crypt
sxuEWSFRXxVOylBA/Z38slAQeY9hzypEt9ZmGDSORBID0VMyvbj1bF5jnfA/rpKm
2HsKh8mZq+Gcgf9iPvVoOpzIgAdVqI3CK6CjXCi87y9LL0alYXXFs/ZEQp46URDv
cv8tiOjEnx+u/c1RpyKHHq0QBKStN8jrdQfVCWfoGhw8bS4SfyXxX/OcngKBp094
lcoR9DTz4F/pkvLwrr0wwCMv2/ayqI5Q6ZzB5Y9OUrb4smLNK/Q7PWsO4sYcGoPL
WpmjZ1TNPCvepWQhqEGrVAHxxCdjNczqaRgia5wqZnlLfhCRRHQqADN0nApabAvS
kXerrgcY25Qy4bWjCk/Y0Q==

$  openssl enc -base64 -in minimum.json.sig 
onVyfVDakk6DP28T40bt2C2xF+gEZwssemNQIg+pz/PjgTQRTDN42K9p81aSkbkN
Wdlab/TqJCmGNZuIhGKe6f+oDTL6PNofEDr8QGyLzv5Lk+2+/fcD/OV2bI6RV2Ar
95on3jzwKIsaDyMT/9oHtBf7EiZptNLpGp8Fkp+4tfgt7z5w1Di4sA1sCUVdgmsR
KIEa2MaOQxKG9DyrxOz/Fjz7RUPMRjCF+AJ8EFkGfzQmj+PmOxwnRW4nMVVqf858
59NXWy1W5L5Smf1/XC14eLh6LMcmJpHeiEIVu9RMKAVJagMP8eOVxM4QAt1Jvq9W
6Dqmako0I+0Rjt9FxFTRAQ==

A assinatura é gerada a partir de um SHA1 do corpo da mensagem original não criptografada.

Nossa intenção é enviar todo o documento formatado como um% HTTPPOST body. Qual é o formato correto, existe um padrão?

    
por Lee Hambley 01.03.2012 / 16:14

2 respostas

1

S / MIME é um padrão para proteger dados MIME , não enviar e-mail especificamente . Não deve haver nenhum problema em usá-lo com HTTP, já que ambos usam os mesmos formatos MIME e até sintaxe de cabeçalho similar. Por exemplo:

POST /receiver HTTP/1.1
Host: example.com
Content-Type: multipart/signed; protocol="application/pkcs7-signature";
    micalg=sha1; boundary="------------ms040900030501050600040105"
Content-Length: 476

--------------ms040900030501050600040105
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

This is a sample message.

--------------ms040900030501050600040105
Content-Type: application/pkcs7-signature
Content-Transfer-Encoding: base64

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIEKDCC
BCQwggMMoAMCAQICAiAJMA0GCSqGSIb3DQEBBQUAMDgxCzAJBgNVBAYTAkxUMRIwEAYDVQQK
(trimmed)
--------------ms040900030501050600040105--

(Note que o OpenPGP também tem um equivalente; o PGP / MIME, que é implementado pela maioria dos clientes de e-mail compatíveis com o PGP, e novamente pode ser usado pelo HTTP.)

O S / MIME usa o PKCS # 7 como base. Você poderia alternativamente usar o PKCS # 7 bruto que poderia ser usado sem qualquer embalagem S / MIME, talvez usando openssl smime -pk7out , que recebe uma mensagem S / MIME e produz uma estrutura PKCS # 7 signedData .

openssl smime -sign | openssl smime -pk7out | openssl asn1parse -i
    
por 01.03.2012 / 16:43
0

Eu fiz algo parecido recentemente em JavaScript para postagens do Ajax, usando apenas limites mimi separando o conteúdo do post Limites de mímica funcionarão como qualquer tecnologia.

// EXEMPLO JS SIMPLES:

var body = '';
var boundary=Math.random().toString().substr(2);
body += "--"+boundary+"\r\ncontent-disposition: form-data; name=content1;\r\ncontent-type: text/plain\r\n\r\n"+content1+"\r\n";
body += "--"+boundary+"\r\ncontent-disposition: form-data; name=content2;\r\ncontent-type: text/plain\r\n\r\n"+content2+"\r\n";
body += "--"+boundary+"--\r\n";

$.ajax({
  url:"/api",
  type: 'POST',
  context:this,
  contentType: 'multipart/form-data; charset=utf-8; boundary=' + boundary,
  data: body,
  error: error_callback,
  success: success_callback
});
Os valores de

acabam de ser recebidos no aplicativo do servidor com parâmetros regulares

//rack
params[:content1]
params[:content2]

//php
$_POST['content1']
$_POST['content2']
    
por 01.03.2012 / 16:41