Dalam seri ini, kita akan:
Instal beberapa alat baris perintah sederhana untuk menandatangani dan mengenkripsi email
Dapatkan kunci pengirim / sertifikat Anda untuk penandatanganan
Kirim pesan yang sudah ditandatangani melalui SparkPost, dan lihat pesan yang diterima
Opsional, dapatkan sertifikat penerima Anda untuk enkripsi
Kirim pesan yang sudah ditandatangani dan dienkripsi melalui SparkPost, dan lihat pesan yang diterima
Coba alat mandiri yang berguna “mimeshow” untuk melihat internals file email.
OK – mari kita mulai!
1. Instal alat-alatnya
Alat demo berada di Github di sini, lengkap dengan instruksi instalasi. Anda mungkin memperhatikan logo “build passing” – Travis dan pytest secara otomatis memeriksa status build. Perlu dicatat bahwa alat ini tidak didukung secara resmi oleh SparkPost, tetapi saya telah mencoba membuatnya kuat dan mudah digunakan.
Jika Anda sudah mengenal Python dan pip, instalasi seharusnya terasa cukup familiar. Pipfile mengurus dependensi eksternal secara otomatis untuk Anda. Setelah selesai, Anda dapat memeriksa semua yang telah terinstal dengan menjalankan
./sparkpostSMIME.py -h
Anda akan melihat teks bantuan yang ramah. Selanjutnya, kita perlu…
2. Dapatkan kunci pengirim / sertifikat Anda untuk penandatanganan
Jika Anda sudah memiliki file kunci untuk identitas pengiriman Anda, Anda dapat melanjutkan. Jika tidak, berikut adalah dua opsi untuk dipilih:
a) Kunci / sertifikat uji tanda tangan mandiri (tidak valid secara eksternal)
Jika Anda hanya melakukan pengujian, Anda dapat membuat sertifikat dan kunci “ditandatangani sendiri” untuk alamat email menggunakan alat baris perintah openssl di Linux, mengikuti prosedur seperti yang ini. Di akhir proses itu, Anda akan memiliki file smime.p12 . Ubah nama file ini untuk mencocokkan identitas pengiriman Anda, termasuk tanda @, misalnya, alice@example.com.p12 .
atau
b) Kunci / sertifikat yang valid secara eksternal
Jika Anda ingin mendapatkan kunci / sertifikat yang valid secara eksternal yang memungkinkan Anda untuk menandatangani, ada daftar penyedia di sini. Saya menemukan Comodo bekerja dengan baik (gratis untuk penggunaan non-komersial), dan ini lebih mudah daripada prosedur penandatanganan sendiri di atas. Ikuti proses pendaftaran, terima email validasi Anda, dan pastikan untuk membuka tautan di Firefox. Buka Preferensi Firefox / Privasi dan Keamanan. Gulir ke Sertifikat / Lihat Sertifikat:
Pilih sertifikat Anda, dan gunakan opsi “Cadangan” untuk menyimpan sebagai file dalam format PKCS12 (tambahkan ekstensi file .p12 ke nama file Anda) yang membawa kunci pribadi dan rantai sertifikat publik.
Berikan kata sandi untuk mengamankan file .p12:
Hasilkan file kunci publik (.crt) dan pribadi (.pem) terpisah
Apakah Anda menggunakan a) atau b), Anda sekarang akan memiliki file .p12 untuk identitas pengirim Anda. Itu adalah langkah besar ke depan – ambil kopi sekarang!
Sekarang kita perlu menghasilkan file kunci publik dan pribadi terpisah seperti ini – substitusikan alamat email Anda sendiri untuk contoh tersebut. (Mac OSX dan Linux):
openssl pkcs12 -in alice\@example.com.p12 -clcerts -nokeys -out alice\@example.com.crt openssl pkcs12 -in alice\@example.com.p12 -nocerts -nodes -out alice\@example.com.pem
Anda perlu memasukkan kata sandi yang Anda berikan sebelumnya. Perhatikan bahwa tanda backslash \ digunakan untuk melarikan tanda @ – bukan memisahkan nama dari jalur direktori (itu adalah slash maju / di Mac OSX dan Linux).
Jika Anda menggunakan Windows, ada implementasi openssl yang tersedia seperti yang MINGW64 yang dibangun ke dalam alat baris perintah Git, tetapi saya menemukan itu cenderung hanya terkunci. Anda mungkin menemukan lebih mudah dan lebih cepat untuk melakukan ini di Linux dan kemudian menyalin file Anda. Alat Git yang sama untuk Windows dilengkapi dengan klien ssh yang baik yang dapat Anda gunakan untuk masuk ke kotak Linux, seperti instansi Amazon EC2.
2.1 Menandatangani pesan
Sudah ada file kunci/sertifikat tiruan dan file sumber email di direktori tes untuk alice@example.com, sehingga Anda dapat mendapatkan beberapa output bahkan sebelum Anda memiliki kunci Anda. Cukup ketik yang berikut:
cd tests ../sparkpostSMIME.py example_email1.eml --sign
Dan Anda akan mendapatkan:
Untuk: Bob <bob@example.com> Dari: Alice <alice@example.com> Subjek: Sebuah pesan MIME-Version: 1.0 Jenis-Konten: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7m" MIIKXAYJKoZIhvcNAQcCoIIKTTCCCkkCAQExDzANBglghkgBZQMEAgEFADCCAQoGCSqGSIb3DQEH AaCB/ASB+VRvOiBCb2IgPGJvYkBleGFtcGxlLmNvbT4NCkZyb206IEFsaWNlIDxhbGljZUBleGFt : :
Anda tidak dapat mengirim email dari example.com melalui SparkPost kecuali Anda memiliki domain itu, jadi langkah selanjutnya adalah menggunakan kunci Anda sendiri dan mengirim pesan yang sudah ditandatangani dari domain Anda sendiri.
3. Kirim pesan yang sudah ditandatangani melalui SparkPost
Sekarang mari kita gunakan domain pengirim yang sebenarnya, diatur sesuai dengan Panduan Pengguna Baru SparkPost. Kami memiliki file sertifikat dan kunci pengirim di direktori saat ini:
steve@thetucks.com.crt steve@thetucks.com.pem
File tests/declaration.eml disertakan dalam proyek. Ini hanya file teks, jadi Anda dapat menyesuaikan alamat From: untuk disesuaikan dengan domain pengiriman Anda sendiri dan alamat To: untuk disesuaikan dengan penerima pengujian Anda. Awal file terlihat seperti ini:
Untuk: Bob <bob.lumreeker@gmail.com> Dari: Steve <steve@thetucks.com> Subjek: Berikut adalah deklarasi kami MIME-Version: 1.0 Jenis-Konten: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-GB Ketika dalam Kursus peristiwa manusia menjadi perlu …
Atur kunci API Anda:
export SPARKPOST_API_KEY=<<Letakkan kunci API Anda di sini>>
Kirim email:
./sparkpostSMIME.py tests/declaration.eml --sign --send_api
Anda akan melihat:
Terbuka koneksi ke https://api.sparkpost.com/api/v1 Mengirim tests/declaration.eml Dari: Steve <steve@thetucks.com> Ke: Bob <bob.lumreeker@gmail.com> OK - dalam 1,15 detik
Sekitar satu detik kemudian, email tiba di kotak masuk Bob. Thunderbird menampilkannya dengan titik merah di amplop, menunjukkan tanda tangan pengirim yang valid.
Keberhasilan! Selesaikan kopi itu, Anda telah mendapatkannya. Jika Anda mengalami masalah, periksa alamat From: Anda di file email cocok dengan nama file .crt dan .pem Anda.
4. Mengenkripsi pesan
Untuk mengenkripsi pesan, Anda memerlukan kunci publik penerima Anda dalam bentuk sertifikat. Ini adalah file teks yang terlihat seperti ini:
Bagikan atribut friendlyName: s COMODO CA Limited ID #2 localKeyID: 32 84 AB 9C 56 5C 80 C6 89 4D 40 46 DD D4 7C 71 E8 CD ED C1 subject=/emailAddress=bob.lumreeker@gmail.com issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Client Authentication and Secure Email CA -----BEGIN CERTIFICATE----- terlihat seperti karakter acak di sini -----END CERTIFICATE-----
Ada sertifikat penerima tiruan untuk bob@example.com di direktori tes, jadi Anda dapat berlatih dengan itu sebelum Anda memiliki sertifikat yang sebenarnya:
cd tests ../sparkpostSMIME.py example_email1.eml --sign --encrypt
Anda akan melihat:
Untuk: Bob <bob@example.com> Dari: Alice <alice@example.com> Subjek: Sebuah pesan MIME-Version: 1.0 Jenis-Konten: application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7m MIIRwQYJKoZIhvcNAQcDoIIRsjCCEa4CAQAxggKlMIICoQIBADCBijCBhDELMAkG :
Anda akan memperhatikan bahwa panjang output cukup lebih lama daripada pesan yang dienkripsi karena membawa banyak informasi tambahan serta pesan yang diacak itu sendiri.
4.1 Mengirim pesan terenkripsi yang sudah ditandatangani melalui SparkPost
Mari kita kirim pesan terenkripsi ke alamat email yang sebenarnya. Anda dapat mengikuti proses yang sama seperti sebelumnya (ditandatangani sendiri atau penyedia seperti Comodo) untuk mendapatkan kunci publik / sertifikat untuk alamat penerima Anda sendiri. Anda hanya perlu file .crt – penerima tidak tidak pernah perlu memberi Anda kunci pribadi mereka (.p12 dan .pem file).
Saya memiliki file bob.lumreeker@gmail.com.crt untuk penerima yang saya maksud – cocok dengan alamat From: di file saya.
Berikut adalah perintah untuk mengirim:
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt --send_api
Saya melihat:
Terbuka koneksi ke https://api.sparkpost.com/api/v1 Mengirim tests/declaration.eml Dari: Steve <steve@thetucks.com> Ke: Bob <bob.lumreeker@gmail.com> OK - dalam 1,168 detik
Email muncul di Thunderbird dengan ikon tanda tangan “titik merah” dan ikon “gembok” yang terenkripsi.
Anda dapat mengirim email berbasis HTML yang kompleks dengan tautan dan gambar dengan mudah, seperti yang ditunjukkan di Bagian 1. Beberapa klien seperti Thunderbird meminta izin untuk menampilkan tautan dan gambar eksternal dalam pesan S/MIME yang dienkripsi, tetapi pesan yang hanya ditandatangani ditampilkan dengan baik di klien termasuk Thunderbird dan Gmail:
Perhatikan bahwa dropdown menunjukkan “Alamat email yang diverifikasi”.
Pemikiran lebih lanjut & hal-hal yang perlu diperhatikan
Alat ini mengambil pendekatan super sederhana untuk menarik kunci yang diperlukan – ia hanya mencari file yang dinamai di direktori saat ini. Pengaturan yang lebih kompleks, seperti menyimpan semua kunci dalam basis data dapat dengan mudah ditambahkan, tetapi saya ingin kode ini tetap sesederhana mungkin.
Anda dapat menyertakan penerima lain dengan Cc: dan Bcc: dan mereka akan dikirim; ini bisa berguna untuk tujuan arsip. Pesan yang ditandatangani diterima dan dapat ditampilkan oleh penerima lain lengkap dengan tanda tangan. Alat ini menghapus header Bcc: dari pesan yang dikirim (seperti yang dilakukan klien email desktop).
Untuk memastikan bahwa pesan melewati SparkPost tanpa perubahan (yang dapat merusak penandatanganan), alat ini mengatur opsi API untuk pengiriman “transaksional”, dengan pelacakan terbuka dan klik yang dinonaktifkan.
Jika Anda menggunakan enkripsi, ingatlah bahwa alat ini mengambil alamat To: tunggal untuk itu. Penerima lainnya dapat mendekode isi pesan hanya jika mereka memiliki kunci pribadi penerima To:. Jika Anda hanya menggunakan penerima sekunder sebagai catatan pengiriman yang dilakukan, misalnya, itu mungkin saja.
Ditandatangani, disegel dikirim... Saya milikmu
Itulah gambaran cepat tentang cara menandatangani, menyegel, dan mengirim pesan S/MIME melalui SparkPost. Pengingat cepat: proyek demo ada di Github di sini, saya telah mencoba untuk membuatnya mudah untuk diinstal dan digunakan.
Fitur bonus: menampilkan bagian MIME dengan “mimeshow”
File multipart MIME RFC822 cukup kompleks untuk dibaca oleh manusia. Proyek ini menyertakan alat mandiri untuk membuat ini lebih mudah, yang disebut mimeshow.
Ini mengambil semua file email yang Anda miliki (bukan hanya yang S/MIME) dan menunjukkan struktur internalnya. Berikut adalah contoh:
./mimeshow.py testcases/img_and_attachment.eml
Anda akan melihat:
Untuk Bob <bob.lumreeker@gmail.com> Dari Steve <steve@thetucks.com> Subjek Pengujian lampiran dll MIME-Version 1.0 Jenis-Konten multipart/mixed; boundary="------------7D48652042860D0098C65210" Jenis-Konten bahasa multipart/alternative; boundary="------------58C0BF87598336550D70EB95" Jenis-Konten teks/plain; charset=utf-8; format=flowed Content-Transfer-Encoding 7bit Content-Transfer-Encoding quoted-printable Jenis-Konten teks/html; charset="utf-8" Jenis-Konten aplikasi/pdf; name="sparkpost-datasheet-tam-technical-account-management.pdf" Content-Transfer-Encoding base64 Content-Disposition lampiran; filename="sparkpost-datasheet-tam-technical-account-management.pdf"
Anda juga dapat menggunakan sebagai filter untuk memberikan ringkasan yang dapat dibaca manusia dari keluaran sparkpostSMIME :
./sparkpostSMIME.py tests/declaration.eml --sign --encrypt | ./mimeshow.py
Anda akan melihat:
Untuk Bob <bob.lumreeker@gmail.com> Dari Steve <steve@thetucks.com> Subjek Berikut adalah deklarasi kami Content-Language en-GB MIME-Version 1.0 Jenis-Konten application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m Content-Transfer-Encoding base64 Content-Disposition lampiran; filename=smime.p7m
Akhirnya...
Untuk merangkum – kami telah menginstal beberapa alat baris perintah sederhana untuk menandatangani dan mengenkripsi email (repositori Github adalah di sini, lengkap dengan instruksi instalasi).
Kami mendapatkan kunci pengirim / sertifikat untuk penandatanganan, dan mengirim pesan yang sudah ditandatangani melalui SparkPost. Kami mendapatkan sertifikat penerima untuk enkripsi, lalu mengirim pesan yang sudah ditandatangani dan dienkripsi melalui SparkPost.
Terakhir, kami mencoba alat mandiri yang berguna “mimeshow” untuk melihat internals file email.
Itu saja untuk sekarang! Sampai jumpa!