Saya menulis program C sederhana, yang menggunakan soket ('klien' dan 'server'). (Penggunaan UNIX / Linux)
Sisi server hanya membuat soket:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Dan kemudian mengikatnya ke sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
Dan mendengarkan (dan menerima dan membaca):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Klien membuat soket, dan kemudian menulis padanya.
Sekarang, saya ingin mengubah koneksi sederhana ini menjadi koneksi SSL, dengan cara yang paling sederhana, paling indah, rapi dan tercepat.
Saya sudah mencoba menambahkan OpenSSL ke proyek saya, tetapi saya tidak dapat menemukan cara mudah untuk menerapkan apa yang saya inginkan.
stunnel
,stunnel4
paket tersebut ada di distro berbasis Debian dan mudah digunakan. Ada beberapa batasan dibandingkan dengan menambahkan dukungan SSL yang tepat di server Anda, tetapi ini bagus untuk solusi cepat. Saya suka stunnel karena sepertinya cocok dengan pendekatan perangkat lunak UNIX.Jawaban:
Ada beberapa langkah saat menggunakan OpenSSL. Anda harus memiliki sertifikat SSL yang dapat berisi sertifikat dengan kunci privat. Pastikan untuk menentukan lokasi yang tepat dari sertifikat (contoh ini memilikinya di root). Ada banyak tutorial bagus di luar sana.
Beberapa termasuk:
Anda perlu menginisialisasi OpenSSL:
Sekarang untuk sebagian besar fungsionalitas. Anda mungkin ingin menambahkan while loop pada koneksi.
Anda kemudian dapat membaca atau menulis menggunakan:
Perbarui The
SSL_CTX_new
harus dipanggil dengan metode TLS yang paling sesuai dengan kebutuhan Anda untuk mendukung versi keamanan yang lebih baru, bukanSSLv23_server_method()
. Lihat: Deskripsi OpenSSL SSL_CTX_newsumber
if
salah. Seharusnyaif (ssl_err <= 0) {
hanya itu kesalahan.SSL_accept()
kembali1
pada kesuksesan,0
pada "kegagalan terkontrol" dan-1
pada "kegagalan fatal". Lihat halaman manual.SSL_CTX_set_tmp_dh[_callback]()
tidak dipanggil. Baru saja menemukan cara yang sulit bahwa sandi NULL tidak akan berfungsi tanpanya, menghasilkan nomor peringatan 40.SSLv23_server_method()
Menyatakan bahwa server memahami SSLv2 dan v3 dan sekarang sudah usang. Untuk mendukung TLS 1.1 dan 1.2 ganti metode itu denganTLS_server_method()
. sumberOpenSSL cukup sulit. Sangat mudah untuk secara tidak sengaja membuang semua keamanan Anda dengan tidak melakukan negosiasi dengan tepat. (Heck, saya secara pribadi telah digigit oleh bug di mana curl tidak membaca peringatan OpenSSL dengan tepat, dan tidak dapat berbicara dengan beberapa situs.)
Jika Anda benar-benar ingin cepat dan sederhana, letakkan stud di depan program Anda selama sehari. Memiliki SSL dalam proses yang berbeda tidak akan memperlambat Anda: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
sumber
Untuk orang lain seperti saya:
Pernah ada contoh di sumber SSL di direktori
demos/ssl/
dengan kode contoh di C ++. Sekarang hanya tersedia melalui riwayat: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslAnda mungkin harus mencari versi yang berfungsi, saya awalnya memposting jawaban ini pada 6 November 2015. Dan saya harus mengedit sumbernya - tidak banyak.
Sertifikat: .pem di
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appssumber
Berikut contoh saya utas server soket ssl (banyak koneksi) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
sumber