Я работаю над созданием API, который требует подписи и отправки зашифрованных сообщений по TLS. TLS - это HTTP/SSL.

Сами сообщения представляют собой не более нескольких сотен килобайт данных JSON, зашифрованных с помощью асимметричных ключей. Инфраструктура PK решается сетью доверия, и стороны находятся в одном городе, поэтому мы можем обмениваться ключами лично.

Мы не можем положиться на GnuPG/PGP, так как поддержка библиотек на языках, которые мы используем, неизвестна, и мы бы предпочли напрямую использовать OpenSSL.

Мы хотим отправить в виде одного открытого текста следующее сообщение и его подпись. С GnuPG/PGP это может выглядеть так:


-----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-----

Однако я не смог найти подходящий способ сделать то же самое с OpenSSL. smime как я понимаю, это не подходит, так как мы не отправляем письма.

Эти два куска:


$ 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==

Подпись генерируется из SHA1 исходного незашифрованного тела сообщения.

Мы намерены отправить весь отформатированный документ в виде тела HTTP POST . Какой формат правильный, есть ли стандарт?

2 ответа2

1

S/MIME - это стандарт защиты данных MIME, а не электронной почты. Не должно быть никаких проблем с использованием его с HTTP, так как оба используют одинаковые форматы MIME и даже похожий синтаксис заголовка. Например:

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--

(Обратите внимание, что OpenPGP также имеет эквивалент; PGP/MIME, который реализуется большинством почтовых клиентов с поддержкой PGP и снова может использоваться HTTP.)


S/MIME использует PKCS # 7 в качестве базы. В качестве альтернативы можно использовать необработанный PKCS # 7, можно использовать без какой-либо обертки S/MIME, возможно, используя openssl smime -pk7out , который принимает сообщение S/MIME и выводит структуру PKD # 7 signedData .

openssl smime -sign | openssl smime -pk7out | openssl asn1parse -i
0

Недавно я сделал нечто подобное в JavaScript для постов Ajax, просто используя границы mimi, разделяющие контент постов. Границы Mime будут работать с любой технологией.

// ПРОСТО JS ПРИМЕР:

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
});

значения только что получены в серверном приложении с обычными параметрами

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

//php
$_POST['content1']
$_POST['content2']

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .