2016-04-04 53 views
1

私はこれらのツールであまり経験がありませんので、私にご負担ください。ソースからSSLを使用してcurlをビルドします。これを行うために、私はソースからOpenSSLもコンパイルしています。ソースからのカールのビルド - SSL_CTX_set_alpn_protosへの未定義参照

OpenSSLをビルドしてインストールすると、アーカイブが作成されます。このタールは開梱されており、curlを建てるときに使用してください。

私はそれをやった方法がある:私はそこを去ったとき、それはOpenSSLの構築マシンのライブラリへの絶対パスが含まれているため

OpenSSLの

./config shared -fPIC --prefix="/some/path/install_dir" 
make depend 
make && make install 

rm -rf /some/path/install_dir/lib/pkgconfig 
# create tar from $prefix/bin $prefix/include $prefix/lib 

pkgconfigは、削除され、これはカールを作る機械とは異なるかもしれません。私はアーカイブのものだけを使いたいと思います。 これが正しいアプローチであるかどうかはわかりません。

カール

前のステップからのアーカイブをコピーして解凍されます。その後

export LIBS='-ldl' 
./configure --prefix="$(pwd)/<install_dir>" --with-ssl="<unpacked-tar>" 
make && make install 

しかし、中make結果:同じ(テスト)マシンの動作上の両方のopensslとカールを構築

../lib/.libs/libcurl.so: undefined reference to `SSL_CTX_set_alpn_protos' 
../lib/.libs/libcurl.so: undefined reference to `SSL_get0_alpn_selected' 

openssl-1.0.2gおよびcurl-7.47.1を使用します。何が間違っているのでしょうか?


カールのconfig.logのは、このようなコマンドをコンパイル含まれています

gcc -o conftest -O2 -Wno-system-headers -I/home/teamcity/buildAgent/work/10199cb4c61825f3/openssl-1.0.2g/include -I/home/teamcity/buildAgent/work/10199cb4c61825f3/openssl-1.0.2g/include/openssl -L/home/teamcity/buildAgent/work/10199cb4c61825f3/openssl-1.0.2g/lib conftest.c -lcrypto -lz -lrt -ldl >&5 

-Iフォルダは、私が含まれるようにしたいものですので、私は、システム全体のlibsがすべきだと思います使用しないでください。

NPNPROTを検索すると、結果が得られないため、ネゴシエーションは無効になりませんでした。

答えて

1

前のステップからアーカイブをコピーして を展開される... 同じ(テスト)マシンの動作上のopensslとカールの両方を構築します。これは、ビルドマシン上でOpenSSLのように聞こえる

は、次のプロトコルネゴシエーションが有効になっているが、先のマシンのOpenSSLは次のプロトコルネゴシエーションなしを建てました。 OpenSSL 1.1.0ではビルドマシンがno-nextprotonegで構成されていたと思います。 OpenSSL 1.0.2以降では、それはno-npnで構成されていたと考えられます。


SSL_CTX_set_alpn_protosはOpenSSL 1.1.0の一部です。1.0.2でも利用できる

$ cd openssl-master 
$ grep -IR SSL_CTX_set_alpn_protos * | egrep '(ssl.h|.pod)' 
doc/ssl/SSL_CTX_set_alpn_select_cb.pod:SSL_CTX_set_alpn_protos, SSL_set_alpn_protos, SSL_CTX_set_alpn_select_cb, 
doc/ssl/SSL_CTX_set_alpn_select_cb.pod: int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, 
doc/ssl/SSL_CTX_set_alpn_select_cb.pod:SSL_CTX_set_alpn_protos() and SSL_set_alpn_protos() are used by the client to 
doc/ssl/SSL_CTX_set_alpn_select_cb.pod:SSL_CTX_set_alpn_protos() and SSL_set_alpn_protos() return 0 on success, and 
include/openssl/ssl.h:__owur int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, 

その:

を、そのパブリック関数は、(これは1.1.0のポリシー変更である)ユーザプログラムによって呼び出されることを意図してそのは、文書化を意味するので.podが重要です

export LIBS='-ldl' 
./configure --prefix="$(pwd)/<install_dir>" --with-ssl="<unpacked-tar>" 
make && make install 

がを確認してください:

$ cd openssl-1.0.2g 
$ grep -IR SSL_CTX_set_alpn_protos * 
apps/s_client.c:  SSL_CTX_set_alpn_protos(ctx, alpn, alpn_len); 
ssl/ssl.h:int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, 
ssl/ssl_lib.c: * SSL_CTX_set_alpn_protos sets the ALPN protocol list on |ctx| to |protos|. 
ssl/ssl_lib.c:int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, 
ssl/ssltest.c:  SSL_CTX_set_alpn_protos(c_ctx, alpn, alpn_len); 
util/ssleay.num:SSL_CTX_set_alpn_protos     387 EXIST::FUNCTION: 

私の推測では、カールが(OpenSSLの0.9.8のような)プロトコルネゴシエーションを欠いOpenSSLの提供下位レベル、ディストリビューションを使用していることですを参照して、設定中にcURLがどのようなものかを確認します。


あなたはとのOpenSSLにプロトコルネゴシエーションを無効にすることができます

  • のOpenSSL 1.0.2 - それは<openssl/opensslconf.hに表示されますno-nextprotoneg

からno-npn

  • のOpenSSL 1.1.0:

    $ cd openssl-master 
    $ ./config no-nextprotoneg 
    ... 
    
    $ find $PWD -name 'opensslconf.h' 
    .../include/openssl/opensslconf.h 
    $ cat .../include/openssl/opensslconf.h | grep PROT 
    #ifndef OPENSSL_NO_NEXTPROTONEG 
    # define OPENSSL_NO_NEXTPROTONEG 
    

    そして:

    $ cd openssl-1.0.2g 
    $ ./config no-npn 
    ... 
    
    $ cat include/openssl/opensslconf.h | grep NPN 
    #ifndef OPENSSL_NO_NPN 
    # define OPENSSL_NO_NPN 
    # if defined(OPENSSL_NO_NPN) && !defined(NO_NPN) 
    # define NO_NPN 
    

    だから、また、それはビルド時に無効になっていませんでした確認する必要があります。


    カールがno-npnno-nextprotonegに完全に同情的ではないように見えます:

    $ git clone https://github.com/curl/curl.git 
    $ cd curl/ 
    $ egrep -IR '(OPENSSL_NO_NPN|OPENSSL_NO_NEXTPROTONEG)' * 
    lib/vtls/openssl.c: && !defined(OPENSSL_NO_NEXTPROTONEG) 
    

    SSL_CTX_set_alpn_protosのための唯一のヒットだこと:

    $ grep -IR SSL_CTX_set_alpn_protos * 
    lib/vtls/openssl.c: SSL_CTX_set_alpn_protos(connssl->ctx, protocols, cur) 
    
  • +0

    は、質問を編集します。 config.logから判断すると、すべて期待通りに見えます。プロトコルネゴシエーションが無効に見えない –