dear all i have made a client server code the client sends a X509 request and the server reply the X509 certificate but i have 2 questions
1- did i fill all the attributes of the X509 certificate in this code or not 2- when i compile this code using eclipse i got allot of errors but all are the same /home/amirale32/workspace/certificate/Debug/../src/client.cc:34: undefined reference to `RSA_generate_key' ./src/client.o: In function `Client::SetPublicKey()': i have attached the code thx allot for help -- Warmest regards and best wishes for a good health,*urs sincerely * *mero*
//============================================================================ // Name : certificate.cpp // Author : Amir // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include "server.h" #include "client.h" using namespace std; int main() { Client clientest; Server servertest; clientest.SetCert(clientest.MakeSignedCertReq(1,2,90)); return 0; }
/* * client.cc * * Created on: Sep 17, 2014 * Author: amirale32 */ #include "client.h" Client :: Client() { m_myCertReq = X509_REQ_new(); m_myCert = X509_new(); m_name = X509_NAME_new(); m_rsa_keyPair = RSA_new(); m_puk = EVP_PKEY_new(); GenerateRSAKeyPair(); SetPublicKey(); } Client :: ~Client() { X509_REQ_free(m_myCertReq); X509_free(m_myCert); X509_NAME_free(m_name); RSA_free(m_rsa_keyPair); EVP_PKEY_free(m_puk); } void Client :: GenerateRSAKeyPair ( ) { m_rsa_keyPair = RSA_generate_key(2048,RSA_F4,NULL,NULL); } void Client::SetPublicKey() { EVP_PKEY_assign_RSA(m_puk,m_rsa_keyPair); } X509_REQ* Client::MakeSignedCertReq(int bits, int serial, int days) { X509_REQ_set_pubkey(m_myCertReq,m_puk); m_name=X509_REQ_get_subject_name(m_myCertReq); //X509_NAME_add_entry_by_txt(name,"C",MBSTRING_ASC, "UK", -1, -1, 0); //X509_NAME_add_entry_by_txt(name,"CN",MBSTRING_ASC, "OpenSSL Group", -1, -1, 0); X509_REQ_sign(m_myCertReq,m_puk,EVP_md5()); return m_myCertReq; } void Client::SetCert(X509_REQ *req) { m_myCert = m_ca->CreateCertificate(m_myCertReq); }
/* * client.h * * Created on: Sep 17, 2014 * Author: amirale32 */ #ifndef CLIENT_H_ #define CLIENT_H_ #include <openssl/rsa.h> #include <openssl/conf.h> #include <openssl/x509.h> #include "server.h" class Client { public: Client(); ~Client(); void GenerateRSAKeyPair (); void SetPublicKey (); X509_REQ *MakeSignedCertReq(int bits, int serial, int days); void SetCert (X509_REQ *req); private: X509_REQ *m_myCertReq; X509 *m_myCert; X509_NAME *m_name; RSA *m_rsa_keyPair; EVP_PKEY *m_puk; Server *m_ca; }; #endif /* CLIENT_H_ */
#include "server.h" Server::Server() { m_myCert = X509_new(); m_caKeyPairs = RSA_new(); m_pukey = EVP_PKEY_new(); GenerateMyKeyPairs(); CreateMyCertificate(); SetPublicKey(); } Server::~Server() { X509_free(m_myCert); RSA_free(m_caKeyPairs); EVP_PKEY_free(m_pukey); } X509* Server::CreateCertificate(X509_REQ* req) { X509 *m_req_reply; m_req_reply = X509_new(); X509_NAME *subject = NULL; EVP_PKEY *pkey = NULL; X509_NAME *issuerSubject = X509_get_subject_name(m_myCert); X509_set_issuer_name(m_req_reply, issuerSubject); //xn_req = X509_REQ_get_subject_name(req); X509_set_subject_name(m_req_reply, subject); pkey = X509_REQ_get_pubkey(req); //rv = X509_set_pubkey(reqreply, pkey); X509_gmtime_adj(X509_get_notBefore(m_req_reply), 0); X509_gmtime_adj(X509_get_notAfter(m_req_reply), 36400); X509_sign(m_req_reply, pkey, EVP_md5()); return m_req_reply; } void Server::CreateMyCertificate() { EVP_PKEY_assign_RSA(m_pukey, m_caKeyPairs); ASN1_INTEGER_set(X509_get_serialNumber(m_myCert), 1); X509_gmtime_adj(X509_get_notBefore(m_myCert), 0); X509_gmtime_adj(X509_get_notAfter(m_myCert), 31536000L); X509_set_pubkey(m_myCert, m_pukey); X509_NAME * name; name = X509_get_subject_name(m_myCert); X509_set_issuer_name(m_myCert, name); X509_sign(m_myCert, m_pukey, EVP_md5()); } void Server::GenerateMyKeyPairs() { m_caKeyPairs = RSA_generate_key(2048,RSA_F4 , NULL , NULL); } void Server::SetPublicKey() { EVP_PKEY_assign_RSA(m_pukey,m_caKeyPairs); } /* * server.cc * * Created on: Sep 17, 2014 * Author: amirale32 */
/* * server.h * * Created on: Sep 17, 2014 * Author: amirale32 */ #ifndef SERVER_H_ #define SERVER_H_ #include <openssl/asn1.h> #include <openssl/ssl.h> #include <openssl/rsa.h> #include <openssl/conf.h> #include <openssl/x509.h> class Server { public: Server(); ~Server(); X509 *CreateCertificate (X509_REQ *req); void CreateMyCertificate(); void GenerateMyKeyPairs ( ); void SetPublicKey (); private: X509 *m_myCert; RSA *m_caKeyPairs; EVP_PKEY *m_pukey; }; #endif /* SERVER_H_ */