BIO_new_connect

libjpeg以来のオープンソース編・・・。

OpenSSLは、SSL通信を実現するためのオープンソースライブラリ・・・。

/index.html

まずは非セキュアな接続から始めてみる・・・。

今回は、

OpenSSL API によるセキュア・プログラミング: 第 1 回 API の概要

を参考に、BIO_new_connectで接続の作成を行う・・・。

/docs/man1.0.2/crypto/BIO_new_connect.html

OpenSSL自体は、手元のFedoraに入っているが、ヘッダなどが無いので、

$ sudo yum install openssl-devel
[sudo] xxx のパスワード:
Yum command has been deprecated, redirecting to '/usr/bin/dnf install openssl-devel'.
See 'man dnf' and 'man yum2dnf' for more information.
To transfer transaction metadata from yum to DNF, run:
'dnf install python-dnf-plugins-extras-migrate && dnf-2 migrate'

メタデータの期限切れの確認は、1:01:43 時間前の Thu Apr 13 15:58:33 2017 に実施しました。
依存性が解決されました。
================================================================================
 Package                  アーキテクチャ
                                      バージョン             リポジトリ    容量
================================================================================
インストール:
 keyutils-libs-devel      x86_64      1.5.9-8.fc24           fedora        46 k
 krb5-devel               x86_64      1.14.1-6.fc24          fedora       652 k
 libcom_err-devel         x86_64      1.42.13-4.fc24         fedora        36 k
 libselinux-devel         x86_64      2.5-3.fc24             fedora       192 k
 libsepol-devel           x86_64      2.5-3.fc24             fedora        79 k
 libverto-devel           x86_64      0.2.6-6.fc24           fedora        16 k
 openssl-devel            x86_64      1:1.0.2k-1.fc24        updates      1.5 M
 pcre-devel               x86_64      8.38-11.fc24           fedora       543 k
 zlib-devel               x86_64      1.2.8-10.fc24          fedora        55 k

トランザクションの要約
================================================================================
インストール  9 パッケージ

総ダウンロード容量: 3.1 M
インストールされる容量: 6.9 M
これでいいですか? [y/N]: y
パッケージをダウンロードしています:
(1/9): zlib-devel-1.2.8-10.fc24.x86_64.rpm      107 kB/s |  55 kB     00:00    
(2/9): libselinux-devel-2.5-3.fc24.x86_64.rpm   274 kB/s | 192 kB     00:00    
(3/9): libsepol-devel-2.5-3.fc24.x86_64.rpm     107 kB/s |  79 kB     00:00    
(4/9): keyutils-libs-devel-1.5.9-8.fc24.x86_64.  61 kB/s |  46 kB     00:00    
(5/9): libcom_err-devel-1.42.13-4.fc24.x86_64.r  61 kB/s |  36 kB     00:00    
(6/9): libverto-devel-0.2.6-6.fc24.x86_64.rpm   111 kB/s |  16 kB     00:00    
(7/9): krb5-devel-1.14.1-6.fc24.x86_64.rpm       82 kB/s | 652 kB     00:07    
(8/9): pcre-devel-8.38-11.fc24.x86_64.rpm        54 kB/s | 543 kB     00:09    
(9/9): openssl-devel-1.0.2k-1.fc24.x86_64.rpm    80 kB/s | 1.5 MB     00:19    
--------------------------------------------------------------------------------
合計                                            151 kB/s | 3.1 MB     00:20     
トランザクションの確認を実行中...
トランザクションの確認に成功しました。
トランザクションのテストを実行中...
トランザクションのテストに成功しました。
トランザクションを実行中...
  インストール  : pcre-devel-8.38-11.fc24.x86_64                            1/9 
  インストール  : libverto-devel-0.2.6-6.fc24.x86_64                        2/9 
  インストール  : libcom_err-devel-1.42.13-4.fc24.x86_64                    3/9 
  インストール  : keyutils-libs-devel-1.5.9-8.fc24.x86_64                   4/9 
  インストール  : libsepol-devel-2.5-3.fc24.x86_64                          5/9 
  インストール  : libselinux-devel-2.5-3.fc24.x86_64                        6/9 
  インストール  : krb5-devel-1.14.1-6.fc24.x86_64                           7/9 
  インストール  : zlib-devel-1.2.8-10.fc24.x86_64                           8/9 
  インストール  : openssl-devel-1:1.0.2k-1.fc24.x86_64                      9/9 
  検証中        : openssl-devel-1:1.0.2k-1.fc24.x86_64                      1/9 
  検証中        : zlib-devel-1.2.8-10.fc24.x86_64                           2/9 
  検証中        : krb5-devel-1.14.1-6.fc24.x86_64                           3/9 
  検証中        : libselinux-devel-2.5-3.fc24.x86_64                        4/9 
  検証中        : libsepol-devel-2.5-3.fc24.x86_64                          5/9 
  検証中        : keyutils-libs-devel-1.5.9-8.fc24.x86_64                   6/9 
  検証中        : libcom_err-devel-1.42.13-4.fc24.x86_64                    7/9 
  検証中        : libverto-devel-0.2.6-6.fc24.x86_64                        8/9 
  検証中        : pcre-devel-8.38-11.fc24.x86_64                            9/9 

インストール済み:
  keyutils-libs-devel.x86_64 1.5.9-8.fc24   krb5-devel.x86_64 1.14.1-6.fc24     
  libcom_err-devel.x86_64 1.42.13-4.fc24    libselinux-devel.x86_64 2.5-3.fc24  
  libsepol-devel.x86_64 2.5-3.fc24          libverto-devel.x86_64 0.2.6-6.fc24  
  openssl-devel.x86_64 1:1.0.2k-1.fc24      pcre-devel.x86_64 8.38-11.fc24      
  zlib-devel.x86_64 1.2.8-10.fc24          

完了しました!
$

openssl-develをインストール・・・。

BIO_new_connect.cで、

非セキュアでもセキュアでもBIO構造体を通して行う・・・。
BIO_new_connectにサーバ名とポート番号を指定して、戻り値のBIO構造体へのポインタをbioに格納する・・・。
(今回は443を指定しているが、非セキュアな接続で使うものなので80のほうが正しいかも・・・。とはいえ、443でもオープンはできる・・・。)
bioがNULLならエラー処理・・・。
NULLでなければ成功で、接続の作成ができたので、"BIO_new_connect success!"とともにポインタbioのアドレス値を出力・・・。
BIO_free_allは、開いたソケットをクローズして、さらにbioの参照先メモリを解放する・・・。

これで、libsslとlibcryptoをリンクしてコンパイルして実行・・・。

$ vi BIO_new_connect.c 
$ gcc -o BIO_new_connect BIO_new_connect.c -lssl -lcrypto
$ ./BIO_new_connect 
BIO_new_connect success! bio = 01963030
$

こんな感じで、bioが取得出来たので、とりあえず接続の作成はできた模様・・・。

Sample/openssl/BIO_new_connect/BIO_new_connect/src/BIO_new_connect at master · bg1bgst333/Sample · GitHub