Cygwin で SSL webdav を作って ローカル、グローバルからアクセスできるようにする

# 背景
joplin のサーバーが欲しかったので、色々と検討した結果。
自宅 Windows マシンに ssl webdav を入れればいいか・・・と思い・・・やってみる
2023年レガシーメソッド

# 目的
簡単だろと思ったら・・・・、以外に手こずったのでレポートしておく。
ローカルセグメントからも SSL で webdav にアクセスできること。
携帯で外から SSL で webdav にアクセスできること。

# 必要なもの
- Windows Cygwin64 , joplin
- Global ip address 1個
- DNS A レコード 2個

# 内容
- 自宅の Global ip アドレスに DNS A レコードを２つホスト名を作る
- 80, 443 をローカルセグメント内へポートフォワードしておく
- Window firewall で 80, 443 を開ける (ssl が動いたら 80は閉じる)
- apache2, ssl virtualhost , basic webdav を install
- certbot で Let’s Encrypt SSL認証書を取得する
- ホスト名のひとつをローカルアドレスで Windows hosts に登録する 
-    例：192.168.1.200 loc.foo.jp 

### apache 80
ssl を取るためにまず 80 httpd を上げて外からアクセスできるようにする必要がある

```
/etc/httpd/conf/httpd.conf
+LoadModule auth_digest_module modules/mod_auth_digest.so
+LoadModule cache_module modules/mod_cache.so
+LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
+LoadModule socache_dbm_module modules/mod_socache_dbm.so
+LoadModule ssl_module modules/mod_ssl.so
+LoadModule dav_module modules/mod_dav.so
+LoadModule dav_fs_module modules/mod_dav_fs.so
+LoadModule dav_lock_module modules/mod_dav_lock.so
+ServerName glb.foo.jp
+DocumentRoot "/cygdrive/k/www/html"
+<Directory "/cygdrive/k/www/html">
+    Options FollowSymLinks
+ErrorLog "/cygdrive/k/www/log/error_log"
+#LogLevel warn
+LogLevel debug
+    CustomLog "/cygdrive/k/www/log/access_log" common
+    ScriptAlias /cgi-bin/ "/cygdrive/k/www/cgi-bin/"
+<Directory "/cygdrive/k/www/cgi-bin">
+Include conf/extra/httpd-dav.conf
+Include conf/extra/httpd-ssl.conf
+Mutex posixsem    これ入れないとハマります
```
httpd が外からアクセス確認できたら、ssl を取得します

### certbot
```
certbot やる前に 80 を開ける必要がある. ちゃんと届く mail address も必要
pip3 install --upgrade pip
pip install certbot

certbot certonly --webroot -w /cygdrive/k/www/html  -d glb.foo.jp -d loc.foo.jp
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/glb.foo.jp/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/glb.foo.jp/privkey.pem
This certificate expires on 2023-10-05.
These files will be updated when the certificate renews.
```

### ssl virtual host 設定 global + local
```
/etc/httpd/conf/extra/httpd-ssl.conf
########################################################################
## SSL Virtual Host Context
## for global
<VirtualHost _default_:443>

#   General setup for the virtual host
DocumentRoot "/cygdrive/k/www/html"
ServerName glb.foo.jp

ServerAdmin you@example.com
ErrorLog "/cygdrive/k/www/log/ssl_error_log2"
TransferLog "/cygdrive/k/www/log/ssl_access_log2"

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

SSLCertificateFile /etc/letsencrypt/live/glb.foo.jp/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/glb.foo.jp/privkey.pem

#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/cygdrive/k/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

</VirtualHost>

########################################################################
## for local
<VirtualHost *:443>
#   General setup for the virtual host
DocumentRoot "/cygdrive/k/www/html"
ServerName loc.foo.jp

ServerAdmin you@example.com
ErrorLog "/cygdrive/k/www/log/ssl_error_log2"
TransferLog "/cygdrive/k/www/log/ssl_access_log2"

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

SSLCertificateFile /etc/letsencrypt/live/loc.foo.jp/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/loc.foo.jp/privkey.pem

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/cygdrive/k/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

</VirtualHost>
```

### webdav
```
/etc/httpd/conf/extra/httpd-dav.conf
DavLockDB "/cygdrive/k/var/DavLock"

Alias /uploads /cygdrive/k/data/uploads
Alias /webdav /cygdrive/k/data/webdav

<Location /webdav>
    Dav On
    AuthType Basic
#    AuthType Digest
    SSLRequireSSL
#    Options None
    AuthName WebDAV
    # You can use the htdigest program to create the password database:
    #   htdigest -c "/etc/httpd/user.passwd" DAV-upload admin
    AuthUserFile /etc/httpd/conf/.htpasswd
#    AuthDigestProvider file

    # Allow universal read-access, but writes are restricted
    # to the admin user.
#    Require valid-user
    <RequireAny>
        Require method GET POST OPTIONS
        Require valid-user
    </RequireAny>
    Options Indexes FollowSymLinks
</Location>
```
```
htpasswd /etc/httpd/conf/.htpasswd davuser
New password:
Re-type new password:
Adding password for user davuser
とか・・・
```
### clients
- windows explorer から接続
https://minory.org/ubuntu-webdav.html

- joplin から接続

オプション -> 同期 -> 
WebDAV URL [glb.foo.jp]  携帯とか外から
WebDAV URL [loc.foo.jp]  家から
username, password


以上。