CertbotによるSSL証明書(CentOS Stream9)

CentOS Stream9 でnginxにLet’s encrypt でSSL証明書を設定した時のメモ。

Certbotの本家ページは以下。

https://certbot.eff.org/

SoftwareでWebサーバーを、SystemでOSを選べばいいのだが、本日時点で、CentOS Stream9は対象にないので、とりあえずCentOS8で。

https://certbot.eff.org/instructions?ws=nginx&os=centosrhel8

1.snapdのインストール

https://snapcraft.io/docs/installing-snap-on-centos

1)EPELの登録(既に登録済みだった)

sudo dnf install epel-release
sudo dnf upgrade

2)インストール

sudo dnf install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap

※この後、一度ログアウトして再ログイン。

2.snapdのバージョン確認と更新

sudo snap install core
sudo snap refresh core

3.Certbotのインストール

sudo snap install --classic certbot

4.Certbotコマンドの設定

コマンドにシンボリックリンクをはる。

sudo ln -s /snap/bin/certbot /usr/bin/certbot

5.証明書の設定

/etc/nginx/nginx.confのserver_nameにドメインが設定されていることが前提。以下コマンドを実行して、server_nameに設定されているドメインを選択する。

sudo certbot --nginx

6.証明書の自動更新の設定

自動更新の確認は以下。

certbot renew --dry-run

スケジューリングは、以下コマンドで確認できる。

sudo systemctl list-timers

Windows11タスクバーからのVPN接続

Windows11にアップデートしたら、タスクバーのWiFiマークをクリックしてもVPN接続が出てこない。以前はWiFiアクセスポイントのリストの上にVPN接続先が表示されていたのだが、これは不便。

Windows11_taskbar_wifi
Windows11のタスクバーWiFiクリック

もしかしてと、右クリックしてみたら、オプションで追加できるよう。

右クリックで、[クイック設定の編集]をクリックして、下の[+追加]をクリックして[VPN]を追加する。

Windows11_add_vpn_to_taskbar
クイックメニューVPNを追加

これで、タスクバーからVPN接続ができるようになる。

Windows11_taskbar_menu_vpn
Windows11のタスクバーWiFi(VPN追加状態)

これでマシになったといえ、以前は1)タスクバーのWiFiマークをクリックで、2)VPNの接続ができたのが、1)タスクバーのWiFiマークをクリック、2)VPNをクリック、3)VPNの接続となっている。MicroSoftは、なんでアップデートで前より使いにくくするのかな・・・

SQLServerExpressの設定

SQLServerExpressインストール後に、最初に構成マネージャー等で設定すること。

1.TCP/IPの有効化

[SQL Server ネットワークの構成] - [SQLEXPRESS のプロトコル]で、[TCP/IP]を右クリックして、[有効にする]に設定。

2.ポートの変更

[TCP/IPのプロパティ] - [IPアドレス]タブで、下の[IP ALL]のポートを任意のポートを設定して、ファイアウォールで指定IPからの接続許可を設定する。

設定後に、 SQLEXPRESSを再起動する。

3.SSMSのインストール

ManageMentStudioをダウロードしてインストールする。

https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

「使用できる言語」のところで、「日本語」を選んでダウンロードする。

1)DB復元

ManageMentStudio からDBを復元する方法については、以下。

https://docs.microsoft.com/ja-jp/sql/relational-databases/backup-restore/restore-a-database-to-a-new-location-sql-server?view=sql-server-ver15

2)外部からの接続

外部PCからのDB接続には、saユーザーのログインを許可するか別のログインユーザーを作成する。

SQLServerの[プロパティー]-[セキュリティ]の[サーバ認証]で、[SQL Server認証モード と Windows認証モード]に設定して再起動し、SQLServer認証を有効にする。

接続先は2.で3ポートを変更しているので、ManageMentStudio でポート指定をIPアドレスの後にカンマ区切りで指定する。

4.ODBC設定

古い32Bitサーバーアプリを動かすために、32BitのODBCの設定が必要。

https://docs.microsoft.com/ja-JP/troubleshoot/sql/connect/odbc-tool-displays-32-bit-64-bit

32Bit用のODBCコマンドは以下にある。

c:\Windows\SysWOW64\odbcad32

サーバーでポート指定をすること。

Windowsサーバー設定

VPSでWindowsサーバー追加時に設定ことのメモ

1.リモートデスクトップのポート変更

以下レジストリの値を変更したいポートにする。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber

ファイアウォールに上記ポートについて、指定IP(VPN)からのみ許可する設定を追加して、再起動

2.ファイアウォールの設定

リモートデスクトップ用ポートの許可を追加する。不要な設定は、無効にする。

3. リモートログイン時 のメール通知

3.1 SMTP

1)サーバーマネージャーの「役割と機能の追加」から「SMTPサーバー」を追加

2)サービス「簡易メール転送プロトコル」のスタートアップの種類を「自動」に

3)迷惑メール対策として、追加サーバーのSFPレコードを設定

3.2タスクスケジュラー設定

タスクスケジューラで、[トリガー: ユーザーセッションへの接続時]にメール通知するように設定。以前はタスクスケジューラからメール送信設定できたが、現在は使えないようなので、PowerShellで以下のようなコマンドを組む。

# 使用するSMTPサーバを指定します
$smtp = "127.0.0.1"
# 差出人アドレスを指定します
$from = "admin@XXXXX.com"
# 宛先アドレスを指定します
$to = "yourmail@XXXX.com"
# 件名を指定します
$subject = "Login(xxxxserver)"

# メール送信のためのSmtpClientクラスをインスタンス化
$cli = New-Object Net.Mail.SmtpClient($smtp)

# メール送信のためのMailMessageクラスをインスタンス化
$mail = New-Object Net.Mail.MailMessage($from, $to)
$mail.Subject = $subject
$mail.Body = "Did you login?"
$mail.SubjectEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
$mail.BodyEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")

# メールを送信します
$cli.Send($mail)

タスクスケジューラの[操作]で、以下のように設定する。

  • 操作:プログラムの開始
  • プログラム/スクリプト:powershell.exe
  • 引数の追加:-Command “コマンドファイルのフルパス”

4.WindowsUpdateの手動化

勝手にUpdateされると困るので、sconfigコマンドから、手動更新に変設して、サーバー再起動する。

5.自動ログオン

サービス化されていない古いアプリサーバーのために、起動時に自動ログインするように設定する。

https://docs.microsoft.com/ja-jp/troubleshoot/windows-server/user-profiles-and-logon/turn-on-automatic-logon

上記では、レジストリにパスワードを平文で保存することになるので、以下のAutoLogonツールを入れるほうがいい。

https://docs.microsoft.com/ja-jp/sysinternals/downloads/autologon

6.アプリケーションエラーの通知

タスクスケジューラで、[トリガー:イベント]で、以下の場合にメール通知するように設定。 メールの送信方法は3と同様。

  • ログ:Application
  • ソース:Application Error
  • イベント ID:1000

VC++のコンパイル警告

昔のVC++プロジェクトを、Visual Studio2019に取り込んだが、古いソースで、最新ではコンパイル警告がいくつか出る。

(コンパイラバージョン別の警告の一覧)

https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/compiler-warnings-by-compiler-version?view=msvc-160

だいぶ昔のソースを取り込んだのもありも、VSも以前よりチェック項目が増えていて結構な数の警告が出た。警告は無視しても動くが、警告を直していくことでいい勉強になることもある。

C4589:Constructor of abstract class ‘type’ ignores initializer for virtual base class ‘type’

 抽象クラス  ’VBase2 ’のコンストラクターは仮想基底クラス 'VBase’ を無視します

これは、仮想基底クラスVBaseを継承する抽象VBase2のコンストラクター定義で、書かなくていい VBase の定義を書いていたということ。抽象クラスを継承した抽象クラスだけど、何となく実装クラスのイメージでコンストラクターのコードを書いて警告が出たということでした。

class VBase
{
public:
	VBase(const int param);
	virtual ~VBase() {};
	
	virtual void mustOverrideMethod() = 0;

private:
	int _param;
};

VBase::VBase(const int param)
{
	_param = param;
}

class VBase2 : public virtual VBase
{
public:
	VBase2(const int param);
	virtual ~VBase2() {};

	virtual void mustOverrideMethod2() = 0;
};

VBase2::VBase2(const int param) : VBase(param)  // ← C4589警告
{
}

この抽象クラスVBase2のコンストラクターの実装が以下。

(誤)
VBase2::VBase2( const int param ) : VBase(param )  // ← C4589警告
{
}

(正)
VBase2::VBase2( const int /* param */ ) 
{
}

VBase2自体も抽象クラスで、ここでVBaseのコンストラクターの引数を定義しても意味は無く、実装クラスで定義する必要があるということ。

class ImplVBase2 : public virtual VBase2
{
public:
	ImplVBase2(const int param);
	virtual ~ImplVBase2() {};

	virtual void mustOverrideMethod() {};
	virtual void mustOverrideMethod2() {};
};

ImplVBase2::ImplVBase2(const int param) : VBase2(param), VBase(param)   // ← ※ここでVBase(param) 定義
{
}

VBase2のコンストラクターで引数を持つ必要がそもそもないということになるが、例えばユーザークラスを実装していて、キーがユーザーNoでそれを引数としている場合には、やはり引数があった方が見た目が良いように個人的には思えるので残した。

UserImpl::UserImpl(const int userNo) : UserBaseEx( userNo ), UserBase( userNo )

↓ 

UserBaseEx::UserBaseEx( const int /* userNo */)  ※このクラスだけ、userNoが無いのもなんか違和感が・・・・

↓

UserBase::UserBase( const int /* userNo */)

C4996 :コンパイラの警告(レベル3)

古いソースのため、推奨されない関数を使っているということで、以下のメッセージが出た。

'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

inet_toaが非推奨で、inet_ntop()かInetNtop()を使えとのことで、inet_ntopに変えたが

https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_ntop

ws2tcpip.hをインクルードしても、「inet_ntopが定義されていない」というエラーが・・・・

ws2tcpip.h の中を見てみると、バージョンチェックではじかれているよう。

https://docs.microsoft.com/ja-jp/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170

古い古いVSで作ったもので、stdafx.hの中のバージョン定義が古すぎのため、inet_ntopの対象外となっていた。astafx.hの中のバージョン定義を変えることで解決。

Debug版のプロジェクト設定の問題

古いプロジェクトから自動移行した場合に、以下の警告が出るので設定変更が必要。

LNK4075:リンカー ツールの警告

/EDITANDCONTINUE は /SAFESEH の指定によって無視されます

追加になったデバッグ用の設定が自動でされていないため、プロジェクトの[プロパティ]-[詳細]で、[デバッグ ライブラリの使用]を「はい」に設定。

D9305:コマンド ラインの警告カー ツールの警告

オプション 'Gm' の使用は現在推奨されていません。今後のバージョンからは削除されます。

プロジェクトの[プロパティ]-[C/C++]-[コード生成]で、[最小リビルドを有効にする]を「いいえ」に設定。

その他

アプリケーションの画面

作成されたアプリケーションの画面サイズが小さくなってしまうので、 プロジェクトの[プロパティ]-[マニフェストツール]-[入出力]で、[DPI認識]を「なし」に設定。