একটি সাধারণ সকেটকে একটি এসএসএল সকেটে পরিণত করুন


115

আমি সাধারণ সি প্রোগ্রাম লিখেছি, যা সকেট ('ক্লায়েন্ট' এবং 'সার্ভার') ব্যবহার করছে। (ইউনিক্স / লিনাক্স ব্যবহার)

সার্ভার পক্ষটি কেবল একটি সকেট তৈরি করে:

sockfd = socket(AF_INET, SOCK_STREAM, 0);

এবং তারপরে এটি সোকাড্ডারের সাথে আবদ্ধ করুন:

bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

এবং শুনে (এবং গ্রহণ করে এবং পড়ে):

listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);

ক্লায়েন্ট সকেট তৈরি করে, এবং তারপরে এটি লিখে।

এখন, আমি এই সাধারণ সংযোগটি একটি স্পষ্টতম, সবচেয়ে idyllic, নেটেস্ট এবং দ্রুততম উপায়ে, একটি এসএসএল সংযোগে রূপান্তর করতে চাই।

আমি আমার প্রকল্পে ওপেনএসএসএল যুক্ত করার চেষ্টা করেছি , তবে আমি যা চাই তা বাস্তবায়নের কোনও সহজ উপায় খুঁজে পাচ্ছি না।


আপনি যদি বিশেষত এসএসএলের পরিবর্তে "সুরক্ষিত সংযোগ" খুঁজছেন, আপনি প্রক্সিচাইনস.সোর্সফোর্জন.নেটের মতো এমন কোনও কিছু দেখতে পাবেন যা আপনার অ্যাপ্লিকেশনের বাইরে থাকে এবং এসএসএইচ সংযোগের মাধ্যমে ট্র্যাফিক প্রেরণের জন্য সেট আপ করতে পারে। যতক্ষণ না অ্যাপ্লিকেশন এসএসএল, আপনি কীভাবে এসএসএল / টিএলএসের কাজ করার কথা বলে তা যদি বোঝেন তবে ওপেনএসএসএল বেশ সহজ। আপনি যদি বিকল্প চান তবে yaSSL বা gnuTLS ব্যবহার করে দেখুন।
বোরিলিড

3
'সহজ উপায়' সংজ্ঞা দিন। ওপেনএসএল সি প্রোগ্রামারদের জন্য মান for আপনার যদি সমস্যা হয় তবে আপনার এটি সম্পর্কে জিজ্ঞাসা করা উচিত।
লার্ন

এই এক চেক করুন দ্বারা OpenSSL প্রোগ্রামিং পরিচিতি (PAR টি ই) । দ্বিতীয় খণ্ডটি আমার পক্ষে অত্যন্ত উন্নত এবং কঠিন। তবে পার্ট 2 একবার দেখুন মূল্যবান।
রিক

ওপেনএসএসএল এপিআই দিয়ে সিকিওর প্রোগ্রামিং পরীক্ষা করুন । তবে আমি ওপেনসেল কীভাবে খারাপ তা সম্পর্কে মতামত এবং চেষ্টা করার মতো অন্যান্য বিকল্পগুলি শুনেছি।
রিক

আরেকটি বিকল্প যেমন একটি বহিস্থিত SSL এর মোড়কের টুল ব্যবহার হয় stunnel, stunnel4প্যাকেজ ডেবিয়ান ভিত্তিক ডিস্ট্রো এবং এটা ব্যবহার করা সহজ। আপনার সার্ভারে যথাযথ এসএসএল সমর্থন যুক্ত করার সাথে কিছু সীমাবদ্ধতা রয়েছে তবে দ্রুত সমাধানের জন্য এটি ভাল হতে পারে। আমি স্টানেল পছন্দ করি কারণ এটি ইউনিক্স সফ্টওয়্যার সরঞ্জামগুলির পদ্ধতির সাথে খাপ খায়।
স্যাম ওয়াটকিন্স

উত্তর:


150

ওপেনএসএসএল ব্যবহার করার সময় কয়েকটি পদক্ষেপ রয়েছে। আপনার অবশ্যই একটি এসএসএল শংসাপত্র তৈরি করতে হবে যাতে প্রাইভেট কী সহ শংসাপত্র থাকতে পারে শংসাপত্রের সঠিক অবস্থান নির্দিষ্ট করে দেওয়ার বিষয়ে নিশ্চিত হন (এই উদাহরণটি মূলটিতে এটি রয়েছে)। অনেক ভাল টিউটোরিয়াল আছে।

কিছু অন্তর্ভুক্ত:

#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

আপনাকে ওপেনএসএসএল শুরু করতে হবে:

void InitializeSSL()
{
    SSL_load_error_strings();
    SSL_library_init();
    OpenSSL_add_all_algorithms();
}

void DestroySSL()
{
    ERR_free_strings();
    EVP_cleanup();
}

void ShutdownSSL()
{
    SSL_shutdown(cSSL);
    SSL_free(cSSL);
}

এখন বেশিরভাগ কার্যকারিতার জন্য। আপনি সংযোগগুলিতে কিছুক্ষণ লুপ যুক্ত করতে চাইতে পারেন।

int sockfd, newsockfd;
SSL_CTX *sslctx;
SSL *cSSL;

InitializeSSL();
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd< 0)
{
    //Log and Error
    return;
}
struct sockaddr_in saiServerAddress;
bzero((char *) &saiServerAddress, sizeof(saiServerAddress));
saiServerAddress.sin_family = AF_INET;
saiServerAddress.sin_addr.s_addr = serv_addr;
saiServerAddress.sin_port = htons(aPortNumber);

bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

sslctx = SSL_CTX_new( SSLv23_server_method());
SSL_CTX_set_options(sslctx, SSL_OP_SINGLE_DH_USE);
int use_cert = SSL_CTX_use_certificate_file(sslctx, "/serverCertificate.pem" , SSL_FILETYPE_PEM);

int use_prv = SSL_CTX_use_PrivateKey_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);

cSSL = SSL_new(sslctx);
SSL_set_fd(cSSL, newsockfd );
//Here is the SSL Accept portion.  Now all reads and writes must use SSL
ssl_err = SSL_accept(cSSL);
if(ssl_err <= 0)
{
    //Error occurred, log and close down ssl
    ShutdownSSL();
}

তারপরে আপনি ব্যবহার করে পড়তে বা লিখতে সক্ষম হবেন:

SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);

আপডেট দ্য SSL_CTX_newTLS এর পদ্ধতি যে শ্রেষ্ঠ তড়কা অনুক্রমে আপনার চাহিদা পরিবর্তে নিরাপত্তার নতুন সংস্করণে সমর্থন করার জন্য, সঙ্গে বলা উচিত SSLv23_server_method()। দেখুন: ওপেনএসএসএল এসএসএল_সিটিএক্স_ নতুন বিবরণ

টিএলএস_মোথড (), টিএলএস_সার্ভার_মোথড (), টিএলএস_ক্লিয়েন্ট_মোথড ()। এগুলি হ'ল সাধারণ উদ্দেশ্যে সংস্করণ-নমনীয় এসএসএল / টিএলএস পদ্ধতি। ব্যবহৃত প্রকৃত প্রোটোকল সংস্করণ ক্লায়েন্ট এবং সার্ভার দ্বারা পারস্পরিক সমর্থনযুক্ত সর্বোচ্চ সংস্করণে আলোচনা করা হবে। সমর্থিত প্রোটোকলগুলি SSLv3, TLSv1, TLSv1.1, TLSv1.2 এবং TLSv1.3।


9
আমি যেমন ভেবেছিলাম তেমন "সরল" নয়, তবে শেষ পর্যন্ত (Godশ্বরের ধন্যবাদ!) আমি কিছু কোড দেখতে পাচ্ছি। এই ক্রস প্ল্যাটফর্মটি নাকি কেবল ইউনিক্স / ইউনিক্স-মতো সিস্টেমের জন্য?
জুলিওমেলগ্রিয়া

3
আমি একাধিক প্ল্যাটফর্মগুলিতে অনুরূপ কোড ব্যবহার করেছি: আর্ম, লিনাক্স এবং উইন্ডোজ।
ক্যাপ্টেনবলি

2
শেষ ifযদিও ভুল। এটি if (ssl_err <= 0) {তখনই হওয়া উচিত এটি একটি ত্রুটি। সাফল্যের সাথে SSL_accept()ফিরে আসে 1, 0"নিয়ন্ত্রিত ব্যর্থতা" এবং -1"মারাত্মক ব্যর্থতা" -এ on ম্যান পৃষ্ঠা দেখুন।

2
এছাড়াও, SSL_CTX_set_tmp_dh[_callback]()ডেকে না নিলে ডিএইচ সাইফারগুলি কাজ করবে না । সবেমাত্র 40 নম্বর সতর্কতা তৈরি করে, কেবলমাত্র সাইফাররা এটি ছাড়া কাজ করবে না এমন কঠোর পথটি সবেমাত্র আবিষ্কার করে
রোমান দিমিত্রিঙ্কো

5
@ দেভনুল SSLv23_server_method()বলছেন যে সার্ভারটি SSLv2 এবং v3 বোঝে এবং এখন হ্রাস পেয়েছে। টিএলএস 1.1 এবং 1.2 সমর্থন করার জন্য সেই পদ্ধতিটি প্রতিস্থাপন করুন TLS_server_method()উত্স
ইজপেইন্ট

17

ওপেনএসএসএল বেশ কঠিন। কথাবার্তা ঠিক মতো না করে দুর্ঘটনাক্রমে আপনার সমস্ত সুরক্ষা ফেলে দেওয়া সহজ। (হেক, আমি ব্যক্তিগতভাবে একটি বাগ দ্বারা কামড়েছি যেখানে কার্ল ওপেনএসএসএল সতর্কতাগুলি ঠিক পড়ছে না, এবং কিছু সাইটের সাথে কথা বলতে পারে নি।)

আপনি যদি সত্যই দ্রুত এবং সহজ চান, আপনার প্রোগ্রামের সামনে স্টাড দিন একটি দিন এটি কল। ভিন্ন প্রক্রিয়াতে এসএসএল থাকা আপনার গতি কমিয়ে দেবে না: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html


11
এটি একটি ব্যবহারিক উত্তর, তবে এটি আসলে প্রশ্নের উত্তর দেয় না।
সুইস


7

আমার মতো অন্যদের জন্য:

ডিরেক্টরিতে এসএসএল উত্সে একবার demos/ssl/সি ++ এর উদাহরণ কোড ছিল। এখন এটি কেবল ইতিহাসের মাধ্যমে পাওয়া যায়: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/ssl

আপনাকে সম্ভবত একটি কার্যকারী সংস্করণ সন্ধান করতে হবে, আমি মূলত এই উত্তরটি নভেম্বর 6 2015 তে পোস্ট করেছি And এবং আমাকে উত্সটি সম্পাদনা করতে হয়েছিল - খুব বেশি নয়।

শংসাপত্র: .pem ইন demos/certs/apps/: https://github.com/openssl/openssl/tree/master/demos/certs/apps


-1

এখানে আমার উদাহরণটি এসএসএল সকেট সার্ভার থ্রেড (একাধিক সংযোগ) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <iostream>

#include <breakermindsslserver.h>

using namespace std;

int main(int argc, char *argv[])
{
    BreakermindSslServer boom;
    boom.Start(123,"/home/user/c++/qt/BreakermindServer/certificate.crt", "/home/user/c++/qt/BreakermindServer/private.key");
    return 0;
}

সমাধানটি সরাসরি আপনার এসও পোস্টে অন্তর্ভুক্ত করুন।
ম্যাকিয়েজ জুরেসকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.