Apache+WebDavで作るリポジトリサーバ

投稿日:  更新日:

リポジトリサーバをApache+WebDavで構築する方法です。

Remote Repositoryの詳細は「Remote Repositoryの構築と参照」を参照してください。

スポンサーリンク

Apache+WebDavとは

ApacheとはオープンソースのHTTPサーバ(ウェブサーバ)です。

HTTPサーバの仕事はウェブブラウザ(FirefoxやEdgeなど)の要求に答えて、コンテンツのデータ(htmlファイルなど)を返すことです。ウェブブラウザはこのデータを受け取って表示します。

この時、接続で使われるTCPポートが80番ポート(SSLを使う場合は443番)です。

このように、HTTPプロトコルはデータをダウンロードすることを主な目的にしています。

アップロードすることも出来ますが、扱えるのはデータ(ファイル)のみです。フォルダの作成・削除・移動・複製といったようなコンテンツの構成を操作することは出来ません。

そのため、コンテンツのアップロードに向きません。コンテンツはフォルダで階層化される場合がほとんどだからです。

HTTPの接続

WebDav(Web-based Distributed Authoring and Versioning)はHTTPプロトコルを拡張した仕様です。仕様にコンテンツの構成を操作する(ファイルならびにフォルダの作成・削除・移動・複製)コマンドが追加されています。

WebDavを使えば、HTTPプロトコルのみでコンテンツのダウンロードとアップロードの両方を扱えます。

HTTP+WebDavの接続

スポンサーリンク

サーバの立ち上げ

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が必要です。

この問題を回避するために、下図のような構成にします。

ライブラリの発行・参照経路(WebDav)
WindowsはドライバレベルでWebDavに対応しています。

リポジトリを共有ドライブにし、ライブラリの発行を共有ドライブに対して行えば、WindowsがWebDavのアクセスに変換してくれます。

ライブラリの参照(ダウンロード)はファイルを一つ一つ読み出すだけなので、HTTPS(HTTP)プロトコルで問題ありません。

スポンサーリンク

ライブラリの発行先URL

最初に、WebDavでアクセス可能なサーバー上のフォルダを、ドライブ「X:」に割り当てます。※ドライブレターは「X」以外でも構いません。

ネットワークドライブの割り当て

注意点は、サーバの指定にホスト名を使う必要があることです。

SSLはサーバの認証を行う際に、証明書に記載されたサーバ名と呼び出しに使われたサーバ名の一致を確認します。不一致の場合は認証されません。よって、割り当ては失敗します。

ホスト名を使うために、前もってhostsファイルへホスト名とIPアドレスの対応を記述しておきます。

hostsファイルは次の場所にあります。

   Windowsの場合
:C:\Windows\System32\drivers\etc\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)で行います。

証明書マネージャの起動

証明書マネージャでインポートを起動します。

Windowsのキーストアに登録1

後は指示に従って証明書を指定します。

Windowsのキーストアに登録2

Windowsのキーストアに登録3

右側のリストに登録した証明書が出現していれば完了です。

Windowsのキーストアに登録4

ライブラリ参照の時

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"
        }
    }
}
    :
スポンサーリンク

関連記事:

アプリ開発の中で作成したクラスや関数などを資産としてライブラリ化し、次のアプリ開発で再利用するといったスタイルは、開発効率を上げる常套手段です。 私のように個人でアプリを開発している場合、この恩恵は薄いのですが、ソフトハウス(死語?)で年間に多くのアプリを開発している現場では濃いと思います。 「誰かが欲しいと思う機能」は「誰もが欲しいと思う機能」です。同じような仕様のアプリ開発を受注することはありませんか?機能の骨幹はライブラリからの流用に任せて、外観は顧客の要望に合わせるだけで済んだら、楽です。 今回は、Android Studio(アプリ開発)で参照するライブラリの種類について、まとめます。 ...
Module Libraryの構築と参照方法について、まとめます。 ※環境:Android Studio Bumblebee | 2021.1.1 ...
Local Repositoryの構築と参照方法について、まとめます。 ※環境:Android Studio Bumblebee | 2021.1.1 ...
Central Repositoryの参照方法について、まとめます。 ...
Remote Repositoryの構築と参照方法について、まとめます。 ※環境:Android Studio Bumblebee | 2021.1.1 ...
リポジトリサーバをGoogle Cloud Storageで構築する方法です。 Remote Repositoryの詳細は「Remote Repositoryの構築と参照」を参照してください。 ...
Module Libraryの構築と参照方法について、まとめます。 この記事は「Module Libraryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。 GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。 ※環境:Android Studio Giraffe | 2022.3.1    :Android Gradle Plugin 8.1.0    :Gradle 8.0 ...
Local Repositoryの構築と参照方法について、まとめます。 この記事は「Local Repositoryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。 Gradle Ver7.x以降、リポジトリの構築方法が若干変更になりました。 また、GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。 ※環境:Android Studio Giraffe | 2022.3.1    :Android Gradle Plugin 8.1.0    :Gradle 8.0 ...
Remote Repositoryの構築と参照方法について、まとめます。 この記事は「Remote Repositoryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。 Gradle Ver7.x以降、リポジトリの構築方法が若干変更になりました。 また、GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。 ※環境:Android Studio Giraffe | 2022.3.1    :Android Gradle Plugin 8.1.0    :Gradle 8.0 ...
スポンサーリンク