2012-04-08 7 views
1

私は、イーサネットクロスオーバーケーブルで接続されているAngstrom Linuxを実行している2つの組み込みシステムを持っています。私は、2つのシステムが互いに通信できるようにするCプログラムを開発しています。ピアツーピアCのLinux認証

2台のコンピュータがお互いに話すとき、最初に相手の身元を確認して接続を暗号化する必要があります。私は認証と暗号化を達成するためにopensslを使用しようとしていますが、私は何をすべきか完全にはわかりません。 ピアツーピアの質問はすべて他の言語に関連しているか、またはopensslに関連していません。 私はOpenSSLプログラミング入門http://www.linuxjournal.com/article/4822からコードを修正して、組み込みシステムを動作させようとしましたが、成功していませんでした。 common.cにあるSSL_CTX * initialize_ctxの中で、またserver.cのload_dh_params(ctx、file)も問題のようです。 Common.cのコードは私の変更の一部です。

SSL_CTX *initialize_ctx(keyfile,password) 
char *keyfile; 
char *password; 
{ 
SSL_METHOD *meth; 
SSL_CTX *ctx; 
char buffer[200]; 
if (!bio_err) 
{ 
    /* Global system initialization*/ 
    SSL_library_init(); 
    SSL_load_error_strings(); 

    /* An error write context */ 
    bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); 
} 

debuglocation(__LINE__,__FILE__); 
/* Set up a SIGPIPE handler */ 
signal(SIGPIPE,sigpipe_handle); 

/* Create our context*/ 
meth=SSLv23_method(); 
ctx=SSL_CTX_new(meth); 

debuglocation(__LINE__,__FILE__); 
/* Load our keys and certificates*/ 


// if (!(SSL_CTX_use_certificate_chain_file(ctx,keyfile))) 
//  berr_exit("Can't read certificate file"); 

debuglocation(__LINE__,__FILE__); 

pass=password; 
/* TODO need to put a password on the key*/ 
//SSL_CTX_set_default_passwd_cb(ctx,password_cb); 
//if (!(SSL_CTX_use_PrivateKey_file(ctx,keyfile,SSL_FILETYPE_PEM))) 

//http://www.openssl.org/docs/ssl/SSL_CTX_use_certificate.html#NOTES 

if(!(SSL_CTX_use_RSAPrivateKey_file(ctx,"private.pem", SSL_FILETYPE_PEM))) 
    berr_exit("Can't read priveate rsa"); 

debuglocation(__LINE__,__FILE__); 
//berr_exit("Can't read key file"); 

// /* Load the CAs we trust*/ 
// if (!(SSL_CTX_load_verify_locations(ctx, 
//          CA_LIST,0))) 
//  berr_exit("Can't read CA list"); 
#if (OPENSSL_VERSION_NUMBER < 0x00905100L) 
SSL_CTX_set_verify_depth(ctx,1); 
#endif 

return ctx; 
} 

そして、ここでserver.cが

void load_dh_params(ctx,file) 
SSL_CTX *ctx; 
char *file; 
{ 
DH *ret=0; 
BIO *bio; 

//http://www.openssl.org/docs/crypto/BIO_s_file.html 
// opens a file just like fopen with the second parameter as the type of open. Here it is read 'r'. 
if ((bio=BIO_new_file(file,"r")) == NULL) 
berr_exit("Couldn't open DH file"); 

//http://www.openssl.org/docs/crypto/pem.html 
ret=PEM_read_bio_DHparams(bio,NULL,NULL, 
NULL); 
BIO_free(bio); 


if(SSL_CTX_set_tmp_dh(ctx,ret)<0) 
berr_exit("Couldn't set DH parameters"); 
} 

である私のdebuglocation機能は、次のようになります。

int debuglocation(int line, char * file) 
{ 
static char c = 'A'; 
printf("Made it to line %d in %s call it %c\n",line,file, c); 
c++; 
return 0; 
} 

私はサーバーから取得したすべてを実行します。

2535:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1075: 

これはクライアントからのものです。

SSL connect error 
2616:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:596: 

また、必要な証明書を作成するために使用するsslコマンドについてもわかりません。 組み込み機器に公開鍵と秘密鍵が1つあればRSAがうまくいくように思えましたので、http://www.devco.net/archives/2006/02/13/public_-_private_key_encryption_using_openssl.php に従ってみてください。

openssl genrsa -out private.pem 1024 
openssl rsa -in private.pem -out public.pem -outform PEM -pubout 

ご協力いただきありがとうございます。より多くの情報が必要な場合は、私に知らせてください。私は、この質問に対する答えが、何らかの認証を必要とする組込みシステムのためにC言語で開発している人にとって本当に役立つと思います。 COMMプロセスを実行するユーザーとして

アンソニー

答えて

0

、SSH_KEYGENを行います。

出力のパブリック部分id_rsa.pubを、他のマシンの〜/ .ssh/authorized_keysに追加します。これで、ログインせずにsshを使用してリモートプログラムを実行できます。

編集。私は証明書で作業するという面倒のために上記を提案しました。あなたはトラストストアを持っている必要があります、ディレクトリのアクセス許可など、私はあなたが行方不明の最初のものはdata on trusted certificatesをロードしていると思う。それを行う方法のリンクを参照してください。 opensslのコマンドラインツールを使用して認証を確認し、プログラムをデバッグしてSSLを同時に取得する方が簡単です。

+0

問題を考えるとき、2つのアプローチがありました。 1. fork、exec(ssh)して結果を解析する、または2. opensslを使って安全なソケットを作る。私はopensslを選択しました。なぜなら、Cプログラムでexec(ssh)を実行すると、より多くのオプションがあるように見えたからです。これは悪い設計の決定でしたか?私はsshを使って自分の組み込みシステムでモニタやキーボードを持っていないので作業します。 – Anthony

0

私はopensslを使用しようとするのではなく、sshを使用してしまいました。それは人生をはるかに単純化しました。たぶん、私はもっと時間があるとき、私はそれを他の方法で把握するでしょう。