1

イーサネットクロスケーブルを介して接続されたAngstromLinuxを実行している2つの組み込みシステムがあります。私は、2つのシステムが相互に通信できるようにするCプログラムを開発しています。

2台のコンピューターが相互に通信するときは、最初に他方のIDを確認し、接続を暗号化する必要があります。私は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つの公開鍵と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で開発している人にとって本当に役立つと思います。

アンソニー

4

2 に答える 2

0

openssl を使用しようとするのではなく、ssh を使用することになりました。それは人生をずっと簡単にしました。もっと時間があれば、別の方法で解決するかもしれません。

于 2012-06-04T20:09:29.220 に答える
0

comm プロセスを実行するユーザーとして、ssh_keygen を実行します。

出力の公開部分 id_rsa.pub を他のマシンの ~/.ssh/authorized_keys に追加します。ログインせずに ssh を使用してリモート プログラムを実行できるようになりました。

編集。証明書を扱う手間がかかるため、上記を提案しました。トラストストア、正しいディレクトリ権限などが必要です。最初に欠けているのは、信頼できる証明書にデータをロードしていると思います。その方法については、リンクを参照してください。openssl のコマンド ライン ツールを使用して承認を確認してから、プログラムをデバッグし、同時に SSL をセットアップする方が簡単です。

于 2012-04-08T03:53:42.250 に答える