IIS上のサイトでセッション管理にステートサーバーモードを利用

ステートサーバーモード

セッション

  • あるクライアントがブラウザから、任意のWEBサイトにアクセスし、当該サイトを閉じるまでの一連の行動
  • しかしWEBサイトを実現するHTTPでは、「クライアントが既にユーザ認証済」や「前ページで操作した内容に合わせて現ページの内容を変更」といった状態を管理することができない。

セッション管理

  • 先のような状態を管理することで「クライアントが既にユーザ認証済」や「前ページで操作した内容に合わせて現ページの内容を変更」といった機能を、WEBサイト上で実現するためのもの
  • 具体的には、WEBサイトが発行したセッションIDなるものを、クライアントのブラウザのクッキーに保存し、必要なときにセッションIDを照合することで現在のクライアントとWEBサイト間の関係や状態を識別している

IISのセッション管理

  • IISは標準で、WEBサイトが発行したセッションIDを、WEBサイトと紐づくアプリケーションプール上で保持しています。
  • 従ってアプリケーションプールをリサイクルしたりすると、セッションIDといった情報が消失してしまう

ステートサーバーモード

  • アプリケーションプールではなく、IISと別プロセスである「ASP.NET状態サービス」というWindowsサービスのプロセスで、セッションIDなどを管理している
  • IISとは別のプロセスで管理するため、アプリケーションプールなどIIS中のプロセスを再起動したとしても、セッションIDなどは維持される

実現方法

  1. Windowsサービスにて「ASP.NET状態サービス」を自動起動に設定
  2. 当該WEBサイトのWeb.configに下記を追記
    .config
    <configuration>
    <system.web>
    <sessionState mode="StateServer" stateConnectionString="tcpip=[環境に合わせたIPアドレス]:42424" timeout="[タイムアウト秒]"/>
    </system.web>
    </configuration>
  3. 当該WEBサイトにブラウザからアクセスしエラーが発生しないことを確認

参考

curlでSSL証明書のエラーを無視する

$ curl https://www.burubom.com
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). The default
 bundle is named curl-ca-bundle.crt; you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
$ curl -k https://www.burubom.com
<html>
...
</html>

PHP経由でダウンロードしたファイルが文字化け

PHPでブラウザからファイルをダウンロードするプログラムを書いたとき、ダウンロードしたファイルが文字化けしていました。

xedit2でダウンロードしたファイルのバイナリを確認すると、先頭に「BOM(Byte Order Mark)」がくっついていました。

そこでサーバ側にあるダウンロード前のファイルを同じく確認しましたが、こちらには”BOM”はくっついていませんでした。

先人によると「UTF-8で書かれているPHPファイルをメモ帳で編集して保存をすると、先頭にBOM(Byte Order Mark)が付与されて保存されてしまいます。」という話で、まさに私も同じ操作をしておりました。

そこでファイルをダウンロードするPHPファイルの先頭に混入していたBOMを取り除いたところ、この現象は解決しました。

。。。文字コードめ。。。

paramikoでSSH経由のコマンド送信

# ssh.py
# Using : python ssh.py "echo 'PASSWORD' | sudo -S ls -all /"

import sys
import paramiko

args = sys.argv

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.123', port=9999, username='USERNAME', password='PASSWORD')
cmd = ''
if args[1] != '':
    cmd = args[1]

stdin, stdout, stderr = ssh.exec_command(cmd)
print('[stdout]')
if stdout != '':
    for line_out in stdout:
        print(line_out.strip())
print('[stderr]')
if stderr != '':
    for line_out in stderr:
        print(line_out.strip())

Pythonで無効なSSL証明書を持つサイトにアクセス

Python 3.x でHTTPSで提供しているサービスにアクセスしたところ下記エラーが発生した。

Traceback (most recent call last):File "/main.py", line 36, in <module>
  main()
File "/main.py", line 18, in main
  soup = BeautifulSoup(opener.open(conf['login_url']).read().decode('utf-8'), 'html.parser')
File "/usr/local/var/pyenv/versions/3.x.x/lib/python3.5/urllib/request.py", line 465, in open
  response = self._open(req, data)
File "/usr/local/var/pyenv/versions/3.x.x/lib/python3.5/urllib/request.py", line 483, in _open
  '_open', req)
File "/usr/local/var/pyenv/versions/3.x.x/lib/python3.5/urllib/request.py", line 443, in _call_chain
  result = func(*args)
File "/usr/local/var/pyenv/versions/3.x.x/lib/python3.5/urllib/request.py", line 1283, in https_open
  context=self._context, check_hostname=self._check_hostname)
File "/usr/local/var/pyenv/versions/3.x.x/lib/python3.5/urllib/request.py", line 1242, in do_open
  raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:646)

先人によると、Python2.7.9以降はSSL証明書が正しくない場合はSSL認証エラーを出力する。下記対応を行うことで、SSL認証エラーの出力を抑えることができる。(セキュリティ上の安全は保障されないが)

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

perl-Mail-Sendmailでメールを送る

#!/usr/bin/perl

use Mail::Sendmail;

print "Content-type: text/plain\n\n";

my %mail;
$mail{'Content-Type'} = 'text/plain; charset="utf-8"';
$mail{'From'} = "test\@hoge.com";
$mail{'To'} = "test\@fuga.com";
$mail{'Subject'} = "Test : perl-Mail-Sendmail";
$mail{'message'} = "This is test mail.";
$out = sendmail %mail;
print ";; result\n",$out,"\n\n";
print ";; log\n",$Mail::Sendmail::log,"\n\n";
print ";; error\n",$Mail::Sendmail::error,"\n\n";

PowerShellでBasic認証突破

$username = "username"
$securePwd = ConvertTo-SecureString "password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($username, $securePwd)
Invoke-RestMethod -Credential $credential -Uri http://hoge.com