1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RustでOpenSSL関連の依存関係に困ったらrustls-tlsを使うことを検討すると良いかも

Last updated at Posted at 2024-09-29

概要

reqwestなど、OpenSSLに依存しているcrateを使用する際、OpenSSL起因でビルドが失敗するなら、rustls-tlsを使うことで回避できるかもしれない。

# Cargo.toml
reqwest = { version = "0.12.7", default-features = false, features = [
    "rustls-tls",
] }

課題

RustでWeb開発をしていると、HTTPクライアントであるreqwestクレートをしばしば使用する。
しかし、reqwestはOpenSSL(クレート名だとopenssl-sysなど)に依存しており、ローカル開発環境や、採用したいDockerイメージによっては、下記のようなエラーにより、ビルドやバイナリの実行に失敗してしまう。

error: failed to run custom build command for `openssl-sys v0.9.103`
error while loading shared libraries: libssl.so.3: cannot open shared obj
ect file: No such file or directory

解決策

Cargo.tomlに下記の通り記載する。

# Cargo.toml
reqwest = { version = "0.12.7", default-features = false, features = [
    "rustls-tls",
] }

ポイントは2つ。

  1. default-features = false: reqwestはデフォルトでnative-tls(こいつはopenssl-sysに依存)に依存しているようなので、明示的にdefault-featuresを無効にする。
  2. featuresrustls-tlsを指定: featuresに指定するだけで、native-tlsの代わりにrustls-tlsに依存してくれる。rustls-tlsは純粋なRust実装なので、共有ライブラリなどは不要。

経緯

解決策の方向性は2種類思いつく。

  1. OpenSSLの依存関係を用意する
  2. OpenSSLへの依存をやめる

本記事は主に2.OpenSSLへの依存をやめる方法について記述した。
1のアプローチも至って真っ当だが、筆者は苦しんだ果、2に行き着いた。

1の苦しみ

  • 必要なライブラリがどれなのかわからない
    • apt-get install libssl-devはまだしも、``
  • 必要なライブラリを入れるためのツールがわからない
  • 必要なライブラリを入れても、環境によってはOpenSSLのインストールに失敗する
  • OpenSSLのインストールに成功しても、Dockerのマルチステージングビルドで、ビルドしたRustのバイナリ以外にどのバイナリが必要なのかわからない
    • ldd(Macならotool)で共有ライブラリは調べられるけど、不足していることもある

2の応用

Cargo.lockgrepして、opensslに依存しているcrateがあれば、rustls-tlsに変更できないか、クレートのfeaturesを調べてみる。など。

筆者は実際に、google-cloud-stargeというクレートを使っているときに、本エラーに遭遇した。
結局、google-cloud-storagereqwestに依存していたので、google-cloud-storagefeaturesを調べて、本記事の解決策と同様にして対応し解決した。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?