リポジトリサーバをApache+WebDavで構築する方法です。
Remote Repositoryの詳細は「Remote Repositoryの構築と参照」を参照してください。
目次
Apache+WebDavとは
ApacheとはオープンソースのHTTPサーバ(ウェブサーバ)です。
HTTPサーバの仕事はウェブブラウザ(FirefoxやEdgeなど)の要求に答えて、コンテンツのデータ(htmlファイルなど)を返すことです。ウェブブラウザはこのデータを受け取って表示します。
この時、接続で使われるTCPポートが80番ポート(SSLを使う場合は443番)です。
このように、HTTPプロトコルはデータをダウンロードすることを主な目的にしています。
アップロードすることも出来ますが、扱えるのはデータ(ファイル)のみです。フォルダの作成・削除・移動・複製といったようなコンテンツの構成を操作することは出来ません。
そのため、コンテンツのアップロードに向きません。コンテンツはフォルダで階層化される場合がほとんどだからです。
WebDav(Web-based Distributed Authoring and Versioning)はHTTPプロトコルを拡張した仕様です。仕様にコンテンツの構成を操作する(ファイルならびにフォルダの作成・削除・移動・複製)コマンドが追加されています。
WebDavを使えば、HTTPプロトコルのみでコンテンツのダウンロードとアップロードの両方を扱えます。
サーバの立ち上げ
Apache+WebDavサーバの立ち上げ方法の詳細は省略します。ウェブ上の他の記事を参照してください。
ただし、立ち上げの際は、次の点を考慮してください。
・サーバは固定IPアドレスにする
・設置場所に合わせたセキュリティ対策を行う
・セキュア通信(Over SSL)を行う
今回、例として、次のようなサーバを立ち上げました。
サーバ名:hoge.example.com IPアドレス:192.168.179.100(固定IP) コンテンツ: /var/www/html // Document root ├── index.html └── webdav // WebDavでアクセス可能なフォルダ └── myrepo // 注意:小文字を使うこと(※) └── ライブラリA └── ライブラリB └── ライブラリC : アクセス制限:全て許可(例なので制限を設けていない) セキュア通信:SSLによる暗号化 ユーザ認証:なし ※リポジトリの「サーバ名+パス名」をURLで指定するため、URLは小文字
ServerName hoge.example.com DocumentRoot /var/www/html <Directory /var/www/html> Require all granted // アクセス制限は全て許可 </Directory> <Directory /var/www/html/webdav> Require all granted // アクセス制限は全て許可 Dav On // WebDavを有効 </Directory> SSLEngine on // SSLを有効 SSLCertificateFile /etc/ssl/certs/hoge.crt // サーバ証明書 SSLCertificateKeyFile /etc/ssl/private/hoge.key // 秘密鍵 : :
ライブラリのアクセス経路
Gradleのmaven-publishプラグインはHTTPS(HTTP)プロトコルに対応していますが、WebDavに対応していません。
ライブラリの発行(アップロード)はフォルダの操作(作成)を伴います。ですので、WebDavが必要です。
この問題を回避するために、下図のような構成にします。
WindowsはドライバレベルでWebDavに対応しています。
リポジトリを共有ドライブにし、ライブラリの発行を共有ドライブに対して行えば、WindowsがWebDavのアクセスに変換してくれます。
ライブラリの参照(ダウンロード)はファイルを一つ一つ読み出すだけなので、HTTPS(HTTP)プロトコルで問題ありません。
ライブラリの発行先URL
最初に、WebDavでアクセス可能なサーバー上のフォルダを、ドライブ「X:」に割り当てます。※ドライブレターは「X」以外でも構いません。
注意点は、サーバの指定にホスト名を使う必要があることです。
SSLはサーバの認証を行う際に、証明書に記載されたサーバ名と呼び出しに使われたサーバ名の一致を確認します。不一致の場合は認証されません。よって、割り当ては失敗します。
ホスト名を使うために、前もってhostsファイルへホスト名とIPアドレスの対応を記述しておきます。
hostsファイルは次の場所にあります。
: 192.168.179.100 hoge.example.com :
これで、Remote Repositoryはローカルなドライブ(共有ドライブ)と同等に扱えます。
ライブラリの発行先URLは次のように表せます。
: afterEvaluate { // 指示書に従った処理はビルド後に行う publishing { // 発行するための指示書 publications { // ライブラリの情報 ... } repositories { // 発行先のリポジトリ maven { url "file:///X:/myrepo" // Windows X:ドライブのmyrepoフォルダ } } } } :
ライブラリの参照先URL
ライブラリの参照先URLは次のように表せます。
: dependencyResolutionManagement { // すべてのモジュールに有効な指示 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { // ライブラリの参照先となるリポジトリのリスト google() mavenCentral() maven { url "https://webdav.example.com/myrepo" } } } :
自己署名証明書に対応
SSLを使った通信において、クライアントは暗号化通信を始める前に、サーバの正当性を送られてきた証明書で判断します。この証明書は認証局(CA)の電子署名が付いています。
信頼に値する認証局の電子署名によって、サーバの正当性が保証されるわけです。
しかし、サーバの正当性が明確である(例:組織内のサーバ)などの理由で、認証局の電子署名を必要としない場面もあります。
そのような時、サーバの証明書に、サーバ自身が署名した電子署名を付ける方法が取られます。自身で認証局の役割を担うのです。
これを自己署名証明書(ルート証明書)といいます。
クライアントから見れば、自己署名証明書は、信頼に値しない認証局が署名をしたものです。ですので、不当なサーバであると判断します。
ただし、クライアントのトラストストア(証明書ストア)にサーバの自己署名証明書が含まれていれば、正当であると見なされます。トラストストアは信頼に値する認証局の証明書が集約されたファイルです。
つまり、自己署名証明書でSSL通信を実現するためには、トラストストアにサーバの自己署名証明書を登録(インポート)しておく必要があります。
ドライブ割り当ての時
Windowsがサーバの正当性を判断するので、Windowsのトラストストアにサーバの自己署名証明書を登録します。
登録は証明書マネージャ(certlm.msc)で行います。
証明書マネージャでインポートを起動します。
後は指示に従って証明書を指定します。
右側のリストに登録した証明書が出現していれば完了です。
ライブラリ参照の時
GradleはJVM(Java Virtual Machine)上で動くビルドツールです。build.gradleファイルのrepositories構文もJVMが処理します。
従って、JVMがサーバの正当性を判断するので、JVMのトラストストアへ自己署名証明書の登録が必要です。
JVMのトラストストアはJREのインストールフォルダにあります。
OOフォルダ\"Android Studio"\jre\lib\security\cacerts ※上記はAndroid Studioのパッケージに含まれたJRE 動作させるJVMによってJREの場所は異なる
このトラストストアをプロジェクト直下にコピーしてから証明書を登録します。
Android Studioのターミナルを開き、keytoolを使って、次にように行います。
※keytool:JAVAに付属する鍵・証明書作成ツール
> cd プロジェクト直下のフォルダ > copy OOフォルダ\"Android Studio"\jre\lib\security\cacerts ※コピー先を省略:カレントフォルダへ同じ名前でコピー > keytool -importcert -keystore ./cacerts -file 自己署名証明書 -alias myrepo キーストアのパスワードを入力してください: changeit : ※デフォルトのパスワード:changeit : 証明書がキーストアに追加されました
トラストストアをダンプして登録された証明書を確認します。
> keytool -list -v -keystore ./cacerts キーストアのパスワードを入力してください: changeit : ※デフォルトのパスワード:changeit : ******************************************* 別名: myrepo 作成日: 2022/04/20 エントリ・タイプ: trustedCertEntry 所有者: ..., CN=hoge.example.com, OU=..., O=..., L=..., ST=..., C=JP 発行者: ..., CN=hoge.example.com, OU=..., O=..., L=..., ST=..., C=JP シリアル番号: ***** 有効期間の開始日: Tue Apr 12 15:52:52 JST 2022 終了日: Thu May 12 15:52:52 JST 2022 証明書のフィンガプリント: SHA1: ***** SHA256: ***** 署名アルゴリズム名: SHA256withRSA サブジェクト公開鍵アルゴリズム: 2048ビットRSA鍵 バージョン: 1 ******************************************* : :
後は、JVMのトラストストアの参照先を、JREのインストールフォルダからプロジェクト直下に変更します。
これは、gradle.propertiesのjvmargsにプロパティを追加することで可能です。
: #org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -Djavax.net.ssl.trustStore="./cacerts" : : #トラストストアのパスワードが必要な時 # -Djavax.net.ssl.trustStorePassword=changeit # ※デフォルトのままであれば省略可能
スキームhttp(SSLなし)で通信
Gradleはネットワーク通信を行う場合、セキュア通信を期待します。
ですので、HTTPではなく、HTTPSを使うのがデフォルトです。
デフォルトから外れますが、HTTP(SSLなし)を使うこともできます。
: dependencyResolutionManagement { // すべてのモジュールに有効な指示 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { // ライブラリの参照先となるリポジトリのリスト google() mavenCentral() maven { allowInsecureProtocol true // HTTPを使う url "http://webdav.example.com/myrepo" } } } :
関連記事: