Как зашифровать электронную почту с S / MIME

930
user60589

Я рассматриваю возможность шифрования некоторых моих писем с помощью S / MIME v3.1, поскольку мои устройства должны поддерживать это.

Теперь мне интересно, есть ли инструмент (командной строки), который мог бы сделать это для меня? Я попытался гуглить это, но я не нашел что-то обещающее.

1
Большинство людей используют почтовый клиент с надстройкой, если они собираются отправлять и получать зашифрованные электронные письма, это позволяет им читать зашифрованные электронные письма в области предварительного просмотра, которые они могут получить. Ramhound 8 лет назад 0

2 ответа на вопрос

2
Law29

Да, OpenSSL ( openssl smimeили openssl cms) может сделать это:

man smime:

ОПИСАНИЕ

Команда smime обрабатывает S / MIME почту. Он может шифровать, расшифровывать, подписывать и проверять сообщения S / MIME.

man cms:

ОПИСАНИЕ

Команда cms обрабатывает почту S / MIME v3.1. Он может шифровать, расшифровывать, подписывать и проверять, сжимать и распаковывать сообщения S / MIME.

Но человек говорит, что он душит некоторые сообщения и не любит v3. user60589 8 лет назад 0
@ user60589 - Похоже, у тебя другая проблема. Вы спросили, было ли это возможно, это действительно возможно, OpenSSL был лишь предложением из многих (мы, перечисляя каждое возможное предложение, не произойдет). Ramhound 8 лет назад 0
@ user60589 Похоже, GNUtls можно использовать и для S / MIME, но я не думаю, что это командная строка, она выглядит довольно интегрированной: http://www.claws-mail.org/faq/index.php/S/ MIME_howto Law29 8 лет назад 0
Может быть, просто можно использовать `mutt` в режиме командной строки, но я никогда не пробовал. Я * использовал * OpenSSL, хотя. Law29 8 лет назад 0
v3 может быть `openssl cms`. grawity 8 лет назад 2
@ Grawity Ну, это показывает, что вы должны перечитать все руководства по одному! Жаль, что много читаю ... Редактирую мой ответ. Law29 8 лет назад 0
0
TEV

Вот скрипт для шифрования уже существующих писем, но вам нужен доступ к ним в виде файлов в формате MH. В качестве бонуса он использует GPG вместо S / MIME, если вторым аргументом является идентификатор ключа GPG. Если вторым аргументом является путь к файлу, оканчивающемуся на .pem, то сценарий предполагает, что вторым аргументом является сертификат X509 в формате pem, для которого соответствующий закрытый ключ в конечном итоге будет использоваться для расшифровки электронной почты.

#!/usr/bin/awk -f  ## Encrypt emails in MH format.  ## 1st argument is email file to encrypt. ## 2nd argument is PGP key identifier, or for S/MIME, certificate file.  BEGIN { ## If second argument ends with .pem, assume that S/MIME output ## is required, otherwise assume PGP/MIME. if (ARGC == 3 && ARGV[2] ~ /\.pem$/) S = 1 ## S/MIME, not PGP  if (S == 1) { Encrypt = "openssl smime -encrypt -aes256 -outform pem " ARGV[2] Encrypt = Encrypt "|sed '/^-----BEGIN PKCS7-----/d;" Encrypt = Encrypt "/^-----END PKCS7-----/d'"} else { Encrypt = "gpg2 --armor --encrypt -r " ARGV[2] Random = "openssl rand -base64 30"}  for (i=2;i < ARGC;i++) delete ARGV[i] ## Just one input file. }  { sub(/\r$/,"",$0)}  ##==========================================================  BlankCount > 0 { ## Everything from the 1st blank line onwards: print $0 | Encrypt ## Pipe opened on 1st matching line; stays open. next}  ##----------------------------------------------------------  $0 ~ /^[^ \t]/ { ## Any line starting with a non-whitespace character. CurrentBlank = 0 if (Started == 0) Started = 1}  ##----------------------------------------------------------  $0 ~ /^[ \t]*$/ { ## Blank line NOT at the top of the file. if (CurrentBlank == 0 && Started == 1) BlankCount++ CurrentBlank = 1  ## New Content-Type and Content-Transfer-Encoding headers to go at the ## end of the header-block, i.e. before the first blank line: if (BlankCount == 1) { if (S == 1) { H = "Content-Type: application/pkcs7-mime;" H = H " name=\"smime.p7m\"; smime-type=enveloped-data\n" H = H "Content-Transfer-Encoding: base64\n" H = H "Content-Disposition: attachment;" H = H " filename=\"smime.p7m\"\n" H = H "Content-Description: S/MIME Encrypted Message"} else { Random | getline Boundary Boundary = "Encrypt_/" Boundary  H = "Content-Type: multipart/encrypted;" H = H "\n boundary=\"" Boundary "\";" H = H "\n protocol=\"application/pgp-encrypted\"\n\n"  H = H "--" Boundary "\n" H = H "Content-Type: application/pgp-encrypted\n\n"  H = H "Version: 1\n\n"  H = H "--" Boundary "\n" H = H "Content-Type: application/octet-stream\n"}  print H  printf("%s\n", ContentType) | Encrypt printf("%s\n\n", TransferEncoding) | Encrypt}}  ##----------------------------------------------------------  ## Save original Content-Type and Content-Transfer-Encoding to put in ## encrypted part:  tolower($0) ~ /^content-type[ \t]*:/ { ContentType = $0 sub(/[^:][^:]*: */,"",ContentType) ContentType = "Content-Type: " ContentType ContentTypeLineNumber = FNR next} tolower($0) ~ /^content-transfer-encoding[ \t]*:/ { TransferEncoding = $0 TransferEncoding = "Content-Transfer-Encoding: " TransferEncoding sub(/[^:][^:]*: */,"",TransferEncoding) TransferEncodingLineNumber = FNR next}  $0 ~ /^[ \t][ \t]*[^ \t]/ { ## Non-blank line starting with space or tab CurrentBlank = 0 if (BlankCount == 0 && FNR > 1) { ## This must be a continuation line in the header if (FNR - 1 == ContentTypeLineNumber) { ContentTypeLineNumber = FNR ContentType = ContentType "\n" $0 next} if (FNR - 1 == TransferEncodingLineNumber) { TransferEncodingLineNumber = FNR TransferEncoding = TransferEncoding "\n" $0 next}}}  ##----------------------------------------------------------  Started == 1 { ## All header lines other than Type and Encoding. print $0}  END { close(Encrypt) if (S == 1) print "" else printf("\n--%s--\n", Boundary)}  ##---------------------------------------------------------- 

Похожие вопросы