折にふれて、さまざまな時刻表現の精度と範囲 (ファイルシステム、データベース、ファイルフォーマット、プロトコル、API など) を調べている。
以下、閏秒はすべて無視 (少なくとも未来の閏秒は決まっていないので確実なことをいえないため)。また、過去についてはグレゴリオ歴を延長したものと仮定する。
SQLite:
ISO-8601 な文字列で表現するので範囲に制限なし。小数点以下も10進任意長。
http://www.sqlite.org/lang_datefunc.html
EXIF 2.1: DateTime, SubsecTime
0000-01-01 00:00:00 以上 10000-01-01 00:00:00 未満。小数点以下は10進任意長。時差の扱いは不明
http://www.exif.org/Exif2-1.PDF
pax (POSIX):
1970-01-01 00:00:00 UTC からの秒数を 任意長の10進数で表現して範囲制限なし。小数点以下も10進任意長。
http://pubs.opengroup.org/onlinepubs/007904875/utilities/pax.html#tag_04_100_13_05
NTPv4 の NTP Date Format:
1900-01-01 00:00:00 UTC からの秒数。符号付整数部64bit, 小数部64bit
-292277022727-01-26 08:29:52 UTC 以上 292277026526-12-05 15:30:08 UTC 未満。2**(-64)秒単位 (約0.05e-18秒単位)。
FreeBSD 5.0 以降の struct bintime:
範囲は time_t に依存。2**(-64)秒単位 (約0.05e-18秒単位)。
struct bintime {
time_t sec;
uint64_t frac;
};
void bintime(struct bintime *bt);
void getbintime(struct bintime *bt);
DB2 の TIMESTAMP (DB2 9.7以降):
0001-01-01 00:00:00.000000000000 以上 9999-12-31 23:59:59.999999999999 以下。1ps 単位。(タイムゾーン情報はない)
(小数点以下の桁数を指定でき、12が最大。TIMESTAMP(12) とした場合)
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0008474.html
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.wn.doc/doc/c0053707.html
NFSv4 (RFC 3010):
-292277022657-01-27 08:29:52.000000000 UTC 以上 292277026596-12-04 15:30:07.999999999 UTC 以下。1ns 単位
struct nfstime4 {
int64_t seconds;
uint32_t nseconds;
}
NFSv3 (RFC 1813):
1970-01-01 00:00:00.000000000 UTC 以上 2106-02-07 06:28:15.999999999 UTC 以下。1ns 単位
struct nfstime3 {
uint32 seconds;
uint32 nseconds;
};
ext4:
1901-12-13 20:45:52.000000000 UTC 以上 2514-05-30 01:53:03.999999999 UTC 以下。1ns 単位
struct ext4_inode {
...
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Inode Change time */
__le32 i_mtime; /* Modification time */
...
__le32 i_ctime_extra; /* extra Change time (nsec << 2 | epoch) */
__le32 i_mtime_extra; /* extra Modification time(nsec << 2 | epoch) */
__le32 i_atime_extra; /* extra Access time (nsec << 2 | epoch) */
__le32 i_crtime; /* File Creation time */
__le32 i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
...
}
linux-2.6.33/fs/ext4/ext4.h
http://www.kazamiya.net/ext4_inode
http://computer-forensics.sans.org/blog/2011/03/14/digital-forensics-understanding-ext4-part-2-timestamps
xfs: ナノ秒
Reiser4: ナノ秒
JFS: ナノ秒
Btrfs: ナノ秒
zfs: ナノ秒
SUSv4 2008:
int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags)
int futimens(int fd, const struct timespec times[2]);
struct stat の st_atim, st_mtim, st_ctim フィールドが struct timespec として定義。
timespec なので 1ns 単位。範囲は time_t に依存。
SUSv2 1997:
int clock_gettime(clockid_t clock_id, struct timespec *tp);
timespec なので 1ns 単位。範囲は time_t に依存。
4.4BSD-Alpha 1992:
struct stat の st_atimespec, st_mtimespec, st_ctimespec フィールドが struct timespec として定義。
timespec なので 1ns 単位。範囲は time_t に依存。
Net2 1991 では定義されていない。
NTFS:
1601-01-01 00:00:00.0000000 UTC 以上 60056-05-28T05:36:10.9551616 UTC 以下。100ns 単位
(1601年から 100ns 単位で 64bit)
NFSv2 (RFC 1094):
1970-01-01 00:00:00.000000 UTC 以上 2106-02-07 06:28:15.999999 UTC 以下。1μs 単位
struct timeval {
unsigned int seconds;
unsigned int useconds;
};
UDF (DVD などのフォーマット):
-32768-01-01 00:00:00.000 以上 32767-12-31 23:59:59.999 以下。1μs 単位。1分単位の時差
http://www.osta.org/specs/pdf/udf260.pdf
struct timestamp { /* ECMA 167 1/7.3 */
Uint16 TypeAndTimezone;
Int16 Year;
Uint8 Month;
Uint8 Day;
Uint8 Hour;
Uint8 Minute;
Uint8 Second;
Uint8 Centiseconds;
Uint8 HundredsofMicroseconds;
Uint8 Microseconds;
}
SUSv2 1997 (もっと古くからあるとは思う):
int utimes(const char *filename, const struct timeval times[2]) 4.2BSD (1983) に存在。Version 7 (1979) にはない。
int gettimeofday(struct timeval *tp, void *tzp); 4.2BSD (1983) に存在。Version 7 (1979) にはない。
1μs 単位。範囲は time_t に依存。
SQL Server の datetime (1/300秒: 3.33ms)
1753-01-01 00:00:00.000 以上 9999-12-31 23:59:59.997 以下。1ms の桁は 0, 3, 7 のいずれかに丸められる。時差の情報はない。
http://msdn.microsoft.com/ja-jp/library/ms187819.aspx
(別の型として datetime2 および datetimeoffset があり、そっちの精度は 100ns)
exFAT: 10ミリ秒(作成、修正)、2秒(アクセス)
1980-01-01 00:00:00.00 以上 2107-12-31 23:59:59.99 以下。10ms 単位。(UTC もしくは ローカルタイム)
http://shullich.blogspot.com/2009/12/time-stamp-format.html
ISO 9660 (ECMA-119):
0001-01-01 00:00:00.00 以上 9999-12-31 23:59:59.99 以下。10ms 単位。15分単位の時差
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-119.pdf
ext3:
1901-12-13 20:45:52 UTC 以上 2038-01-19 03:14:07 UTC 以下。1s 単位
ReiserFS: 1秒
HFS Plus (Mac, Mac OS 8.1 以降):
1904-01-01 00:00:00 UTC 以上 2040-02-06 06:28:16 UTC 以下。1s 単位
HFS (Mac, System 3.1以降):
1904-01-01 00:00:00 UTC 以上 2040-02-06 06:28:16 UTC 以下。1s 単位
Macintosh File System:
1904-01-01 00:00:00 UTC 以上 2040-02-06 06:28:16 UTC 以下。1s 単位
「初期の Macintosh コンピュータの設計が理由で、1904 年 1 月 1 日より前の日付はサポートされていません。
この設計は、1900 年がうるう年ではなかったという事実に関連する問題の発生を避けることを目的としたものでした。」
http://support.microsoft.com/kb/180162/ja
gzip (RFC 1952):
1970-01-01 00:00:00 UTC から 1s 単位で 32bit 整数。符号の扱いは不明。
値が 0 の場合は time stamp がないことを示すので、1970-01-01 00:00:00 UTC は表現できない。
符号有なら 1901-12-13 20:45:52 UTC 以上 2038-01-19 03:14:07 UTC 以下。ただし 1970-01-01 00:00:00 UTC を除く。
符号無なら 1970-01-01 00:00:01 UTC 以上 2106-02-07 06:28:15 UTC 以下。
png (RFC 2083): tIME Image last-modification time
0000-01-01 00:00:00 UTC 以上 65535-12-31 23:59:59 UTC 以下。1s 単位
TIFF 6.0: DateTime header
0000-01-01 00:00:00 以上 9999-12-31 23:59:59 以下。1s 単位。時差の扱いは不明
http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf
なお、TIFF/EP で TimeZoneOffset が定義され、それにより -12 から 11 まで 1h 単位で UTC との時差を指定できる。
ustar (POSIX):
1970-01-01 00:00:00 UTC から 1s 単位で 8進数12桁。符号の扱いは不明。
符号有なら 1697-10-17 11:03:28 UTC 以上 2242-03-16 12:56:31 UTC 以下。
符号無なら 1970-01-01 00:00:00 UTC 以上 4147-08-20 07:32:15 UTC 以下。
Internet Mail (RFC 5322): Date ヘッダ
0000-01-01 00:00:00 から 1s 単位で制限なし。時差は 1分単位
TLS 1.1 の struct Random 内の uint32 gmt_unix_time:
1970-01-01 00:00:00 UTC 以上 2106-02-07 06:28:15 UTC 以下。1s 単位
乱数の一部としての扱いで、時刻として扱われるものではないが。
FAT:
1980-01-01 00:00:00 以上 2107-12-31 23:59:58 以下。2s 単位。(ローカルタイム)
Date で 2byte, Time で 2byte, 計4byte で表現
http://shullich.blogspot.com/2009/12/time-stamp-format.html
ZIP: FAT と同じ形式
1980-01-01 00:00:00 以上 2107-12-31 23:59:58 以下。2s 単位。(ローカルタイム)
http://www.pkware.com/documents/casestudies/APPNOTE.TXT
MySQL:
DATETIME: 1000-01-01 00:00:00 以上 9999-12-31 23:59:59 以下。1s 単位
TIMESTAMP (MAXDB モード): DATETIME と同じ
TIMESTAMP (非MAXDB モードあるいはMySQL 4.1 より前): 1970 年の始まりから 2037 年の一定の時点までを範囲とし、時間分解能は 1 秒
http://dev.mysql.com/doc/refman/4.1/ja/datetime.html
MySQL 5.6 からは、1s未満も扱えるらしい http://nippondanji.blogspot.jp/2012/10/mysql-56.html
Internet X.509 Profile (RFC 5280):
UTCTime: 1950-01-01 00:00:00 UTC 以上 2049-12-31 23:59:59 UTC 以下。1秒単位
GeneralizedTime: 0000-01-01 00:00:00 UTC 以上 9999-12-31 23:59:59 UTC 以下。1秒単位Reversible Computing をちょっと調べたのだが、熱が出るのは情報を失うときなので、情報を失わない計算、つまり逆方向に実行できる計算に注目するという話らしい。
しかし、ハードウェアについてはともかく、いずれソフトウェアでも情報を失わないように強制される (あるいは推奨される) ようになるのだろうか、もしそうなったら、プログラミングの感じがずいぶんと変わる気がするなぁ。
朝、aptitude update したら、BADSIG A040830F7FAC5991 だという。
09:17:58% sudo aptitude update ... Fetched 199 B in 14秒 (14 B/s) W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://dl.google.com stable Release: 以下の署名が無効です: BADSIG A040830F7FAC5991 Google, Inc. Linux Package Signing Key <linux-packages-keymaster@google.com> W: http://dl.google.com/linux/chrome/deb/dists/stable/Release を取得できませんでした: W: Some index files failed to download. They have been ignored, or old ones used instead.
昼前にもう一回やったら、とくに問題なく通った。
11:30:02% sudo aptitude update ... Fetched 2,791 B in 11秒 (245 B/s) 現在の状態: 更新が 1 個 [+1]。
こういうこともあるのか。
ふと思い立って、利用しているレンタルサーバ (CORESERVER) で FTPS が使えるか試してみたところ、微妙によろしくないようだ。
CORESERVER は以下のアナウンスにあるように、ちゃんとした証明書を使って FTPS を提供している。
POPS/SMTPS/IMAPS/FTPSでの正式な証明書の提供開始について
しかし、試してみると動かない。
% lftp -d lftp :~> set ftp:ssl-force yes lftp :~> open s1-xrea-com.value-domain.com ---- ホストアドレスを解決しています... ---- 1 address found: 203.189.104.101 lftp s1-xrea-com.value-domain.com:~> user foo bar lftp foo@s1-xrea-com.value-domain.com:~> ls ---- s1-xrea-com.value-domain.com (203.189.104.101) ポート 21 に接続中 <--- 220 ProFTPD ---> FEAT <--- 211-Features: MDTM MFMT AUTH TLS MFF modify;UNIX.group;UNIX.mode; MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*; PBSZ PROT REST STREAM SIZE <--- 211 End ---> AUTH TLS <--- 234 AUTH TLS successful ---> OPTS MLST modify;perm;size;type;UNIX.group;UNIX.mode;UNIX.owner; Certificate: C=JP,ST=Osaka,L=Osaka-shi,O=DigiRock\, Inc.,OU=Hostmaster,CN=*.value-domain.com Issued by: C=US,O=DigiCert Inc,OU=www.digicert.com,CN=DigiCert High Assurance CA-3 ERROR: Certificate verification: Not trusted **** Certificate verification: Not trusted ---- コントロールソケットを閉じています ls: 致命的エラー: Certificate verification: Not trusted
エラーメッセージを見ると、DigiCert High Assurance CA-3 という証明書を信用できないという問題である。
この証明書がなにものなのか探して見ると、 DigiCert Trusted Root Authority Certificates に書いてあって、DigiCert というところが発行した、中間証明書 (Intermediate Certificates) のようである。
証明書をとってきて中身を調べると、たしかに自己署名証明書ではなく、上位の証明書がある。
% wget https://www.digicert.com/CACerts/DigiCertHighAssuranceCA-3.crt
% openssl x509 -in DigiCertHighAssuranceCA-3.crt -text|grep CN
Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3
その上位の証明書 (DigiCert High Assurance EV Root CA) をとってきて調べると、これは自己署名証明書である。
% wget https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt
% openssl x509 -in DigiCertHighAssuranceEVRootCA.crt -text|grep CN
Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
Debian の ca-certificates にそれらしい証明書があるか調べて見ると、DigiCert High Assurance EV Root CA はある。
% dpkg -L ca-certificates|grep DigiCert /usr/share/ca-certificates/mozilla/DigiCert_High_Assurance_EV_Root_CA.crt /usr/share/ca-certificates/mozilla/DigiCert_Global_Root_CA.crt /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt
比較すると、ちゃんと一致する。(改行が LF と CRLF と違うようで、--ignore-all-space はその違いを無視するため)
% diff --ignore-all-space -u /usr/share/ca-certificates/mozilla/DigiCert_High_Assurance_EV_Root_CA.crt DigiCertHighAssuranceEVRootCA.crt
というわけで、検証に成功してもいいようなものだが、失敗してしまうというのが問題である。
明示的にルート証明書 (DigiCert High Assurance EV Root CA) を指定しても挙動は変わらない。
% lftp lftp :~> set ssl:ca-file DigiCertHighAssuranceEVRootCA.crt lftp :~> set ftp:ssl-force yes lftp :~> open s1-xrea-com.value-domain.com lftp s1-xrea-com.value-domain.com:~> user foo bar lftp foo@s1-xrea-com.value-domain.com:~> ls ls: 致命的エラー: Certificate verification: Not trusted lftp foo@s1-xrea-com.value-domain.com:~>
ところが、ルート証明書ではなく、中間証明書を指定すると挙動が変わってうまく接続できる。
% lftp lftp :~> set ssl:ca-file DigiCertHighAssuranceCA-3.crt lftp :~> set ftp:ssl-force yes lftp :~> open s1-xrea-com.value-domain.com lftp s1-xrea-com.value-domain.com:~> user foo bar lftp foo@s1-xrea-com.value-domain.com:~> ls ls: ログインに失敗しました: 530 Login incorrect. lftp foo@s1-xrea-com.value-domain.com:~>
ここでは foo という不正なユーザ名を使っているのでログインに失敗しているが、これは SSL 接続に成功したことを意味している。FTPS では SSL 接続ができないかぎりユーザ名やパスワードを送らないので、ユーザ名やパスワードが間違っているという症状は SSL 接続が成功しない限り起こらない。
何が起こっているかというと、接続時にサーバ自体の証明書は送ってくれるのだが、中間証明書は送ってくれないのであろう。検証にはサーバ証明書から信用する証明書 (ルート証明書) に至る証明書の並びのすべてが必要で、ルート証明書はクライアントが (どれを信用するかというポリシーにしたがって) 選ぶものなので接続時にサーバが送る必要はないのだが、それ以外の証明書 (サーバ証明書と中間証明書) はサーバが接続時にクライアントに送るのが原則である。(たとえば、DigiCert も「DigiCert の root 証明書にたどり着けるよう、サーバー側に中間証明書をインストールし、中間証明書の情報をブラウザ等に伝えてやる必要があります。」などと説明している。)
もし中間証明書が送られていないとすると、中間証明書を信用するよう設定すれば接続できることをうまく説明できる。今回の指定した中間証明書はサーバ証明書を直接署名しているので、中間証明書を信用しているなら、接続時にサーバ証明書から信用する証明書までのすべての証明書が揃う。
これを確認する方法は原始的な方法しか思いつかなかった。ftp-ssl パッケージの ftp では FTPS の通信をダンプできるのでこれを使う。
% ftp -d -z debug -z verify=1 s1-xrea-com.value-domain.com
SSL_DEBUG_FLAG on
Connected to s1.xrea.com.
220 ProFTPD
ftp: setsockopt: Bad file descriptor
Name (s1-xrea-com.value-domain.com:akr): foo
---> AUTH SSL
234 AUTH SSL successful
write to 0x21c3bb0 (320 bytes => 320 (140))
0000 - 16 03 01 01 3b 01 00 01-37 03 03 4f fd 6a ac c7 ....;...7..O.j..
0010 - 5c 6d 65 80 da 79 f3 9e-32 51 e9 f1 3a 5b 24 eb \me..y..2Q..:[$.
0020 - 4f 20 e5 ab b7 1e 93 b4-05 b9 22 00 00 9e c0 30 O ........"....0
0030 - c0 2c c0 28 c0 24 c0 14-c0 0a c0 22 c0 21 00 a3 .,.(.$.....".!..
0040 - 00 9f 00 6b 00 6a 00 39-00 38 00 88 00 87 c0 32 ...k.j.9.8.....2
0050 - c0 2e c0 2a c0 26 c0 0f-c0 05 00 9d 00 3d 00 35 ...*.&.......=.5
0060 - 00 84 c0 12 c0 08 c0 1c-c0 1b 00 16 00 13 c0 0d ................
0070 - c0 03 00 0a c0 2f c0 2b-c0 27 c0 23 c0 13 c0 09 ...../.+.'.#....
0080 - c0 1f c0 1e 00 a2 00 9e-00 67 00 40 00 33 00 32 .........g.@.3.2
0090 - 00 9a 00 99 00 45 00 44-c0 31 c0 2d c0 29 c0 25 .....E.D.1.-.).%
00a0 - c0 0e c0 04 00 9c 00 3c-00 2f 00 96 00 41 c0 11 .......<./...A..
00b0 - c0 07 c0 0c c0 02 00 05-00 04 00 15 00 12 00 09 ................
00c0 - 00 14 00 11 00 08 00 06-00 03 00 ff 02 01 00 00 ................
00d0 - 6f 00 0b 00 04 03 00 01-02 00 0a 00 34 00 32 00 o...........4.2.
00e0 - 0e 00 0d 00 19 00 0b 00-0c 00 18 00 09 00 0a 00 ................
00f0 - 16 00 17 00 08 00 06 00-07 00 14 00 15 00 04 00 ................
0100 - 05 00 12 00 13 00 01 00-02 00 03 00 0f 00 10 00 ................
0110 - 11 00 23 00 00 00 0d 00-22 00 20 06 01 06 02 06 ..#.....". .....
0120 - 03 05 01 05 02 05 03 04-01 04 02 04 03 03 01 03 ................
0130 - 02 03 03 02 01 02 02 02-03 01 01 00 0f 00 01 01 ................
read from 0x21c3bb0 (7 bytes => 7 (7))
0000 - 16 03 01 00 30 02 ....0.
0007 - <SPACES/NULS>
read from 0x21c3bb0 (46 bytes => 46 (2E))
0000 - 00 2c 03 01 4f fd 6a ac-1c b1 39 69 fe 47 d9 c3 .,..O.j...9i.G..
0010 - 19 6d e7 8a 17 51 b2 2c-47 ec 6e f0 83 f6 e4 9c .m...Q.,G.n.....
0020 - df 9f 15 48 00 00 39 00-00 04 00 23 ...H..9....#
002e - <SPACES/NULS>
read from 0x21c3bb0 (5 bytes => 5 (5))
0000 - 16 03 01 06 5c ....\
read from 0x21c3bb0 (1628 bytes => 1628 (65C))
0000 - 0b 00 06 58 00 06 55 00-06 52 30 82 06 4e 30 82 ...X..U..R0..N0.
0010 - 05 36 a0 03 02 01 02 02-10 03 78 aa 49 b6 d3 4e .6........x.I..N
0020 - 3c bc ad 5e d3 8f 12 f7-4d 30 0d 06 09 2a 86 48 <..^....M0...*.H
0030 - 86 f7 0d 01 01 05 05 00-30 66 31 0b 30 09 06 03 ........0f1.0...
0040 - 55 04 06 13 02 55 53 31-15 30 13 06 03 55 04 0a U....US1.0...U..
0050 - 13 0c 44 69 67 69 43 65-72 74 20 49 6e 63 31 19 ..DigiCert Inc1.
0060 - 30 17 06 03 55 04 0b 13-10 77 77 77 2e 64 69 67 0...U....www.dig
0070 - 69 63 65 72 74 2e 63 6f-6d 31 25 30 23 06 03 55 icert.com1%0#..U
0080 - 04 03 13 1c 44 69 67 69-43 65 72 74 20 48 69 67 ....DigiCert Hig
0090 - 68 20 41 73 73 75 72 61-6e 63 65 20 43 41 2d 33 h Assurance CA-3
00a0 - 30 1e 17 0d 31 30 30 31-30 35 30 30 30 30 30 30 0...100105000000
00b0 - 5a 17 0d 31 33 30 31 30-38 32 33 35 39 35 39 5a Z..130108235959Z
00c0 - 30 7c 31 0b 30 09 06 03-55 04 06 13 02 4a 50 31 0|1.0...U....JP1
00d0 - 0e 30 0c 06 03 55 04 08-13 05 4f 73 61 6b 61 31 .0...U....Osaka1
00e0 - 12 30 10 06 03 55 04 07-13 09 4f 73 61 6b 61 2d .0...U....Osaka-
00f0 - 73 68 69 31 17 30 15 06-03 55 04 0a 13 0e 44 69 shi1.0...U....Di
0100 - 67 69 52 6f 63 6b 2c 20-49 6e 63 2e 31 13 30 11 giRock, Inc.1.0.
0110 - 06 03 55 04 0b 13 0a 48-6f 73 74 6d 61 73 74 65 ..U....Hostmaste
0120 - 72 31 1b 30 19 06 03 55-04 03 14 12 2a 2e 76 61 r1.0...U....*.va
0130 - 6c 75 65 2d 64 6f 6d 61-69 6e 2e 63 6f 6d 30 81 lue-domain.com0.
0140 - 9f 30 0d 06 09 2a 86 48-86 f7 0d 01 01 01 05 00 .0...*.H........
0150 - 03 81 8d 00 30 81 89 02-81 81 00 bb d9 0f fa 4c ....0..........L
0160 - 72 da ee a1 42 9d ff f4-21 b6 07 13 69 ec ea 59 r...B...!...i..Y
0170 - dc af e0 02 a0 09 e5 45-ab ea f2 05 36 cb 55 a7 .......E....6.U.
0180 - 59 3e 67 e9 18 32 48 ca-0a 77 55 33 21 38 15 b8 Y>g..2H..wU3!8..
0190 - 1a 52 26 25 b2 25 4d 13-2f cf 19 e7 61 34 6a 22 .R&%.%M./...a4j"
01a0 - 53 ed ef 97 1b 57 44 4b-fc 38 10 db cc be 6d ab S....WDK.8....m.
01b0 - 71 22 9d 4c 75 cd 7f 40-71 16 2d fc 72 80 e8 c4 q".Lu..@q.-.r...
01c0 - f0 f4 d1 d7 a0 64 70 0e-91 7d 8b b1 db 87 99 6c .....dp..}.....l
01d0 - 76 df d4 ce 40 73 96 39-37 32 a9 02 03 01 00 01 v...@s.972......
01e0 - a3 82 03 64 30 82 03 60-30 1f 06 03 55 1d 23 04 ...d0..`0...U.#.
01f0 - 18 30 16 80 14 50 ea 73-89 db 29 fb 10 8f 9e e5 .0...P.s..).....
0200 - 01 20 d4 de 79 99 48 83-f7 30 1d 06 03 55 1d 0e . ..y.H..0...U..
0210 - 04 16 04 14 e5 70 ad 18-7f 95 e0 c6 6c ba 14 a9 .....p......l...
0220 - eb 24 8c 84 cc e8 b6 c8-30 2f 06 03 55 1d 11 04 .$......0/..U...
0230 - 28 30 26 82 12 2a 2e 76-61 6c 75 65 2d 64 6f 6d (0&..*.value-dom
0240 - 61 69 6e 2e 63 6f 6d 82-10 76 61 6c 75 65 2d 64 ain.com..value-d
0250 - 6f 6d 61 69 6e 2e 63 6f-6d 30 7f 06 08 2b 06 01 omain.com0...+..
0260 - 05 05 07 01 01 04 73 30-71 30 24 06 08 2b 06 01 ......s0q0$..+..
0270 - 05 05 07 30 01 86 18 68-74 74 70 3a 2f 2f 6f 63 ...0...http://oc
0280 - 73 70 2e 64 69 67 69 63-65 72 74 2e 63 6f 6d 30 sp.digicert.com0
0290 - 49 06 08 2b 06 01 05 05-07 30 02 86 3d 68 74 74 I..+.....0..=htt
02a0 - 70 3a 2f 2f 77 77 77 2e-64 69 67 69 63 65 72 74 p://www.digicert
02b0 - 2e 63 6f 6d 2f 43 41 43-65 72 74 73 2f 44 69 67 .com/CACerts/Dig
02c0 - 69 43 65 72 74 48 69 67-68 41 73 73 75 72 61 6e iCertHighAssuran
02d0 - 63 65 43 41 2d 33 2e 63-72 74 30 0e 06 03 55 1d ceCA-3.crt0...U.
02e0 - 0f 01 01 ff 04 04 03 02-05 a0 30 0c 06 03 55 1d ..........0...U.
02f0 - 13 01 01 ff 04 02 30 00-30 65 06 03 55 1d 1f 04 ......0.0e..U...
0300 - 5e 30 5c 30 2c a0 2a a0-28 86 26 68 74 74 70 3a ^0\0,.*.(.&http:
0310 - 2f 2f 63 72 6c 33 2e 64-69 67 69 63 65 72 74 2e //crl3.digicert.
0320 - 63 6f 6d 2f 63 61 33 2d-32 30 30 39 67 2e 63 72 com/ca3-2009g.cr
0330 - 6c 30 2c a0 2a a0 28 86-26 68 74 74 70 3a 2f 2f l0,.*.(.&http://
0340 - 63 72 6c 34 2e 64 69 67-69 63 65 72 74 2e 63 6f crl4.digicert.co
0350 - 6d 2f 63 61 33 2d 32 30-30 39 67 2e 63 72 6c 30 m/ca3-2009g.crl0
0360 - 82 01 c6 06 03 55 1d 20-04 82 01 bd 30 82 01 b9 .....U. ....0...
0370 - 30 82 01 b5 06 0b 60 86-48 01 86 fd 6c 01 03 00 0.....`.H...l...
0380 - 01 30 82 01 a4 30 3a 06-08 2b 06 01 05 05 07 02 .0...0:..+......
0390 - 01 16 2e 68 74 74 70 3a-2f 2f 77 77 77 2e 64 69 ...http://www.di
03a0 - 67 69 63 65 72 74 2e 63-6f 6d 2f 73 73 6c 2d 63 gicert.com/ssl-c
03b0 - 70 73 2d 72 65 70 6f 73-69 74 6f 72 79 2e 68 74 ps-repository.ht
03c0 - 6d 30 82 01 64 06 08 2b-06 01 05 05 07 02 02 30 m0..d..+.......0
03d0 - 82 01 56 1e 82 01 52 00-41 00 6e 00 79 00 20 00 ..V...R.A.n.y. .
03e0 - 75 00 73 00 65 00 20 00-6f 00 66 00 20 00 74 00 u.s.e. .o.f. .t.
03f0 - 68 00 69 00 73 00 20 00-43 00 65 00 72 00 74 00 h.i.s. .C.e.r.t.
0400 - 69 00 66 00 69 00 63 00-61 00 74 00 65 00 20 00 i.f.i.c.a.t.e. .
0410 - 63 00 6f 00 6e 00 73 00-74 00 69 00 74 00 75 00 c.o.n.s.t.i.t.u.
0420 - 74 00 65 00 73 00 20 00-61 00 63 00 63 00 65 00 t.e.s. .a.c.c.e.
0430 - 70 00 74 00 61 00 6e 00-63 00 65 00 20 00 6f 00 p.t.a.n.c.e. .o.
0440 - 66 00 20 00 74 00 68 00-65 00 20 00 44 00 69 00 f. .t.h.e. .D.i.
0450 - 67 00 69 00 43 00 65 00-72 00 74 00 20 00 43 00 g.i.C.e.r.t. .C.
0460 - 50 00 2f 00 43 00 50 00-53 00 20 00 61 00 6e 00 P./.C.P.S. .a.n.
0470 - 64 00 20 00 74 00 68 00-65 00 20 00 52 00 65 00 d. .t.h.e. .R.e.
0480 - 6c 00 79 00 69 00 6e 00-67 00 20 00 50 00 61 00 l.y.i.n.g. .P.a.
0490 - 72 00 74 00 79 00 20 00-41 00 67 00 72 00 65 00 r.t.y. .A.g.r.e.
04a0 - 65 00 6d 00 65 00 6e 00-74 00 20 00 77 00 68 00 e.m.e.n.t. .w.h.
04b0 - 69 00 63 00 68 00 20 00-6c 00 69 00 6d 00 69 00 i.c.h. .l.i.m.i.
04c0 - 74 00 20 00 6c 00 69 00-61 00 62 00 69 00 6c 00 t. .l.i.a.b.i.l.
04d0 - 69 00 74 00 79 00 20 00-61 00 6e 00 64 00 20 00 i.t.y. .a.n.d. .
04e0 - 61 00 72 00 65 00 20 00-69 00 6e 00 63 00 6f 00 a.r.e. .i.n.c.o.
04f0 - 72 00 70 00 6f 00 72 00-61 00 74 00 65 00 64 00 r.p.o.r.a.t.e.d.
0500 - 20 00 68 00 65 00 72 00-65 00 69 00 6e 00 20 00 .h.e.r.e.i.n. .
0510 - 62 00 79 00 20 00 72 00-65 00 66 00 65 00 72 00 b.y. .r.e.f.e.r.
0520 - 65 00 6e 00 63 00 65 00-2e 30 1d 06 03 55 1d 25 e.n.c.e..0...U.%
0530 - 04 16 30 14 06 08 2b 06-01 05 05 07 03 01 06 08 ..0...+.........
0540 - 2b 06 01 05 05 07 03 02-30 0d 06 09 2a 86 48 86 +.......0...*.H.
0550 - f7 0d 01 01 05 05 00 03-82 01 01 00 84 a9 c8 80 ................
0560 - 0b 0f 18 c3 45 3a 9d e8-ac 0c 6c 33 85 6d 16 10 ....E:....l3.m..
0570 - 5b 19 2c 5d c1 4d f9 09-94 31 cc c1 32 7b c8 87 [.,].M...1..2{..
0580 - 65 c8 d5 80 5d 35 c8 f6-0b 39 59 54 c2 74 2b c6 e...]5...9YT.t+.
0590 - c0 ef ef 86 9c 19 eb ad-2e b7 54 cf 29 72 4f c6 ..........T.)rO.
05a0 - 07 7a 58 55 37 92 53 d2-35 cd 31 2d 08 9f 80 ee .zXU7.S.5.1-....
05b0 - 3b 43 65 59 1d 82 be 12-b0 30 d2 b5 2a e9 98 bf ;CeY.....0..*...
05c0 - 6f 59 97 4d be 1c db 31-94 9b 77 0f 84 50 41 a7 oY.M...1..w..PA.
05d0 - 90 e8 e8 61 86 3e e5 eb-db 28 a1 2a 69 8a 21 97 ...a.>...(.*i.!.
05e0 - d4 0b a6 66 27 1d 0a d4-eb 82 84 4c cb 86 ff 27 ...f'......L...'
05f0 - c2 a8 c7 d4 88 98 0e d2-9f 4c 14 fa ba db 23 cb .........L....#.
0600 - 0d 0c 1a 75 9d 3c cc bb-f4 cb 01 7b d2 6e 76 97 ...u.<.....{.nv.
0610 - 9b f7 e4 53 65 3f d4 8c-e9 4a bf 40 a3 ae 54 1c ...Se?...J.@..T.
0620 - c1 fe e9 7e 92 c6 d9 66-ac 27 99 a8 16 02 10 07 ...~...f.'......
0630 - d8 92 12 b0 60 18 47 99-40 98 9c eb 4d e3 b2 2a ....`.G.@...M..*
0640 - 63 61 34 d8 77 e6 14 d0-55 91 55 dc 97 f9 f4 f7 ca4.w...U.U.....
0650 - a7 10 3c ab 76 e1 1a 59-0e 44 c5 49 ..<.v..Y.D.I
write to 0x21c3bb0 (7 bytes => 7 (7))
0000 - 15 03 01 00 02 02 30 ......0
ftp: SSL_connect error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
: Success
ダンプされた中身を見ると、
0080 - 04 03 13 1c 44 69 67 69-43 65 72 74 20 48 69 67 ....DigiCert Hig 0090 - 68 20 41 73 73 75 72 61-6e 63 65 20 43 41 2d 33 h Assurance CA-3
というように、DigiCert High Assurance CA-3 という名前は出てくるが、DigiCert High Assurance EV Root CA という名前は出てこない。中間証明書の中にはそれに署名している上位の証明書の名前が入っているはずなのに、それがないということは、送られてきていないのであろう。
サポートに伝えたところ、担当部門に伝えるということなので、そのうち直るかもしれない。(直らないかもしれない。)
しかし、もっとわかりやすい調べ方はないかな。HTTPS みたいに、TCP の先頭から SSL が始まるのであれば、openssl s_client -showcerts が証明書を解析して表示してくれるようだが、FTPS だと途中からだからなぁ。
% openssl s_client -showcerts -connect redmine.ruby-lang.org:443 CONNECTED(00000003) depth=1 C = IL, O = StartCom Ltd., OU = Secure Digital Certificate Signing, CN = StartCom Class 1 Primary Intermediate Server CA verify error:num=20:unable to get local issuer certificate verify return:0 --- Certificate chain 0 s:/description=590348-c54I1AmdbczmSg0s/CN=bugs.ruby-lang.org/emailAddress=postmaster@ruby-lang.org i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA ... 1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority ... Server certificate subject=/description=590348-c54I1AmdbczmSg0s/CN=bugs.ruby-lang.org/emailAddress=postmaster@ruby-lang.org issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA ...
ふと、fork が失敗したときに ruby がどう振る舞うか調べてみた。
% ruby -v
ruby 2.0.0dev (2012-01-10 trunk 34265) [x86_64-linux]
% for n in {98..90}
do
ruby -e 'n = ARGV.shift.to_i;
p n
Process.setrlimit(:NPROC, n)
pid = fork { p [:c, $$] }
p [:p, pid]
Process.wait pid
' $n
done
98
[:p, 24982]
[:c, 24982]
97
[:p, 24987]
[:c, 24987]
96
[:p, 24992]
[:c, 24992]
95
[:p, 24997]
[FATAL] Failed to create timer thread (errno: 11)
94
[FATAL] Failed to create timer thread (errno: 11)
[FATAL] Failed to create timer thread (errno: 11)
93
[FATAL] Failed to create timer thread (errno: 11)
92
[FATAL] Failed to create timer thread (errno: 11)
91
[FATAL] Failed to create timer thread (errno: 11)
90
[FATAL] Failed to create timer thread (errno: 11)
1.9 以降では、timer thread があるので、fork 直前には、プロセス内に main thread と timer thread のふたつがある。すべてがうまくいって子プロセスができると、子プロセス内にも main thread と timer thread のふたつができる。
とある理由により、親プロセスは fork system call を呼ぶ瞬間には timer thread を殺すので、まず親プロセスの timer thread が死んで、その後で子プロセスの main thread が生まれ、その後で親子両方で timer thread が生まれる。
結局 3つスレッドが生まれるので、(race condition を考慮しなければ) NPROC の値によって 4種類の挙動が観測できるはずで、そのとおりの結果になっている。
うまくいった場合:
96 [:p, 24992] [:c, 24992]
子プロセスの main thread と親プロセスの timer thread は生まれなかったが、子プロセスの timer thread は作れなかった:
95 [:p, 24997] [FATAL] Failed to create timer thread (errno: 11)
子プロセスの main thread は生まれたが、親子両方の timer thread は作れなかった:
94 [FATAL] Failed to create timer thread (errno: 11) [FATAL] Failed to create timer thread (errno: 11)
子プロセスを作れなかった:
93 [FATAL] Failed to create timer thread (errno: 11)
tb 0.7 をリリースした。