Символьные ссылки в Windows

Под ссылками в Windows я понимаются ссылки в NTFS. В FAT механизмов ссылок предусмотрено не было.

Ядро Windows поддерживает следующие виды ссылок:

  • Hard Links — жёсткие ссылки, как в *nix. Доступны начиная с Windows NT4;
  • Junction Points — аналог символических ссылок. Доступен начиная с Windows 2000 (NTFS 5);
  • Symbolic Links — символьные ссылки. Доступны начиная с Windows Vista.

Если вы никогда не имели дела с символическими и жёсткими ссылками, но хотели бы узнать о них, советую прочитать отрывок из документации файлового менеджера FAR:

Жесткие и символические связи

На разделах NTFS также можно создавать жесткие (HardLink) связи для файлов и символические (SymLink) для папок с помощью команды Alt-F6.

Жесткие связи применяются для файлов. Символические связи — для папок и дисков.

Жесткие связи

Жесткая связь (HardLink) — это просто еще одна запись в папке для данного файла.

Когда создается жесткая связь, сам файл не копируется физически, а только появляется под еще одним именем или в еще одном месте, а его старые имя и местонахождение остаются нетронутыми. С этого момента жесткая связь неотличима от первоначальной записи в папке. Единственное отличие — то, что для жесткой связи не создается короткое имя файла, поэтому из программ ДОС она не видна.

Когда меняется размер или дата файла, все соответствующие записи в папках обновляются автоматически. При удалении файла он не удаляется физически до тех пор, пока все жесткие связи, указывающие на него, не будут удалены. Порядок их удаления значения не имеет. При удалении жесткой связи в корзину количество связей у файла сохраняется.

FAR умеет создавать жесткие связи, отображать количество жестких связей для каждого файла в отдельной колонке (по умолчанию это последняя колонка в 9-м режиме панелей), а также сортировать файлы по количеству жестких связей.

Жесткие связи поддерживаются в NTFS, начиная с NT 4.0. Создавать жесткие связи можно только на том же диске, на котором расположен исходный файл.

Символические связи

NTFS начиная с версии 5.0 (Windows 2000/XP) поддерживает символические связи (SymLink). Символические связи папок в Windows 2000/XP известны как «directory junctions» — технология, позволяющая отображать любые локальные папки на любые другие локальные папки. Например, если папка D:\SYMLINK указывает на C:\WINNT\SYSTEM32 в качестве своей цели, то программа, обращающаяся к D:\SYMLINK\DRIVERS, будет на самом деле обращаться к C:\WINNT\SYSTEM32\DRIVERS.

FAR умеет создавать символические связи только на локальных дисках, файловая система которых поддерживает эту возможность (Windows 2000/XP/NTFS 5.0). В отличие от жестких связей, символические связи не обязательно должны указывать на тот же диск.

Напрямую делать символические связи на папки CD-ROM нельзя, но можно это ограничение обойти, смонтировав CD-ROM диск на папку NTFS-раздела.

Там говорится только о Hard Links и Junction Points, но этого вполне достаточно. Symbolic Links действуют так же, как и Junction Points, с той разницей, что могут указывать на файлы (и реализованы в Windows по-другому).

Hard Links можно создавать только на файлы, Junction Points — только на директории, Symbolic Links — на файлы и директории. В дальнейшем под «жёсткими ссылками» подразумеваются Hard Links, под «символьными» — Junction Points и Symbolic Links.

Жёсткие ссылки действительны в пределах одного раздела, символьные — могут пересекать границы разделов. В связи с этим символьные ссылки могут поломаться, если структуру разделов поменять.

Не со всем, что поддерживается ядром, умеет нормально работать эксплорер. Будьте осторожны при использовании Junction Points в версиях Windows до Vista. При удалении Junction Point эксплорер может залезть внутрь директории, на которую ссылается Junction Point и поудалять там всё, а затем удалить Junction Point, хотя должен лишь удалить ссылку. Наверняка могут возникнуть проблемы и при перемещении или копировании Junction Point’ов.

Мне неизвестно, нормально ли в версиях Windows до Vista относятся к Junction Points стандартные утилиты типа rmdir.

Дополнительные материалы по теме

Отмечу англоязычную статью, в которой описаны нюансы использования ссылок и некоторые программы, позволяющие с ними работать. Статья устаревшая, так что в ней говорится только о Hard Links и Junction Points (причём на последние в статье нередко ссылаются, как на symbolic links…).

Хорошее описание всех видов ссылок есть ещё в справке по NTFS Links (дополнение для Total Commander).

Софт

Теперь можно перейти к рассмотрению программ для работы со ссылками. Да-да, если вы не пользуетесь FAR, вам понадобятся отдельные программы. Все программы, перечисленные ниже, бесплатны.

Утилиты от Microsoft

Windows >= Vista

В Windows Vista добавили команду

mklink

для создания символьных и жёстких ссылок.

Windows >= 2000
fsutil hardlink create ссылка файл

Создаёт Hard Link на файл (источник).

linkd ссылка директория

Создаёт Junction Point на директорию (источник). Утилита входит в Microsoft Windows Resources Kit.

Расширения для Explorer

NTFS Link интегрируется в Explorer и добавляет во всплывающее меню, появляюшееся после перетаскивания правой кнопкой мыши, пункты «Create junction point» и «Create hard link». Кроме того, она перехватывает вызовы Explorer’а, обеспечивая нормальное перемещение/копирование/удаление созданных ссылок.

NTFS Links (не путать с дополнением для Total Commander) — абсолютно аналогичная программа.

Я рекомендую: Link Shell Extension — аналогичная программа, обладающая расширенным функционалом и очень подробным описанием.

NTFS Links — дополнение для Total Commander

Страница программы. Плагин может запускаться как отдельная программа, вне Total Commander’а.

FAR

Консольный файловый менеджер FAR уже давно поддерживает Hard Links и Junction Points «из коробки». Для создания ссылки используйте сочетание клавиш Alt-F6.

Junction Link Magic

Junction Link Magic — программа с графическим интерфейсом для создания, изменения и модификации Junction Points.

Junction — консольная программа для создания Junction Points

Junction лучше, чем

linkd

, тем, что не нужно тащить весь Resource Kit.

Источник

Замена Explorer.exe или изменение дефолтной оболочки Windows

По умолчанию, при загрузке Windows активируется дефолтная оболочка (Explorer.exe), показывающая пользовательский рабочий стол. Вы можете изменить это поведение заменив explorer.exe на ваше собственное приложение, поправив один параметр в реестре.

Ключ: HKEY_Local_Machine\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

Имя: Shell

Значение: Explorer.exe

Замените Explorer.exe на имя вашего приложения. Убедитесь, что вы ввели правильный путь для приложения. Теперь вам достаточно только перелогинить пользователей для вступления изменений в силу.

Отличия типов datetime и timestamp в MySQL

На днях я столкнулся с тем, что многие разработчики не знают в чём отличие типов данных DATETIME и TIMESTAMP в MySQLе, а так же как хранить дату и время, если необходимо учитывать разные часовые пояса для разных пользователей веб-приложения. Поэтому хочу дать ниже разъяснения с пояснениями.

DATETIME
Хранит время в виде целого числа вида YYYYMMDDHHMMSS, используя для этого 8 байтов. Это время не зависит от временной зоны. Оно всегда отображается при выборке точно так же, как было сохранено, независимо от того какой часовой пояс установлен в MySQL. Даю пример:

mysql> CREATE TABLE `dt1` ( col datetime NOT NULL );
mysql> SET @@SESSION.time_zone='+00:00';
mysql> SELECT now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 18:13:56 |
+---------------------+
 
mysql> INSERT INTO dt1 VALUES(now());
 
mysql> SET @@SESSION.time_zone='+01:00';
mysql> SELECT now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 19:14:20 |
+---------------------+
 
mysql> INSERT INTO dt1 VALUES(now());
 
mysql> SET @@SESSION.time_zone='+00:00';
mysql> SELECT * FROM dt1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:14:10 |
| 2009-06-04 19:14:27 |
+---------------------+

TIMESTAMP
Хранит 4-байтное целое число, равное количеству секунд, прошедших с полуночи 1 января 1970 года по усреднённому времени Гринвича (т.е. нулевой часовой пояс, точка отсчёта часовых поясов). При получении из базы отображается с учётом часового пояса. Часовой пояс может быть задан в операционной системе, глобальных настройках MySQL или в конкретной сессии. Запомните, что сохраняется всегда количество секунд по UTC (универсальное координированное время, солнечное время на меридиане Гринвича), а не по локальному часовому поясу. Пример:

mysql> CREATE TABLE tm1 (col TIMESTAMP NOT NULL);
mysql> SET @@SESSION.time_zone = '+00:00';
mysql> SELECT now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 18:24:54 |
+---------------------+
mysql> INSERT INTO tm1 VALUES(now());
mysql> SELECT * FROM tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:25:08 |
+---------------------+
 
mysql> SET @@SESSION.time_zone = '+01:00';
mysql> SELECT now();
+---------------------+
| now() |
+---------------------+
| 2009-06-04 19:25:21 |
+---------------------+
mysql> INSERT INTO tm1 VALUES(now());
mysql> SELECT * FROM tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 19:25:08 |
| 2009-06-04 19:25:26 |
+---------------------+
 
mysql> SET @@SESSION.time_zone = '+00:00';
mysql> SELECT * FROM tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:25:08 |
| 2009-06-04 18:25:26 |
+---------------------+

Ещё одно отличие! TIMESTAMP по умолчанию NOT NULL, а его значение по умолчанию равно NOW().

mysql> INSERT INTO dt1 VALUES(NULL);
ERROR 1048 (23000): COLUMN 'col' cannot be NULL
mysql> INSERT INTO tm1 VALUES(NULL);
Query OK, 1 ROW affected (0.00 sec)
mysql> SELECT * FROM tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 18:25:08 |
| 2009-06-04 18:25:26 |
| 2009-06-04 18:32:50 |
+---------------------+


Дополнение.
Для тех, кого смущает использование функции NOW().

mysql> SET @@SESSION.time_zone = '+00:00';
mysql> INSERT INTO dt1 VALUES('2009-06-04 22:00:00');
mysql> SET @@SESSION.time_zone = '+01:00';
mysql> SELECT * FROM dt1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 22:00:00 |
+---------------------+
 
mysql> SET @@SESSION.time_zone = '+00:00';
mysql> INSERT INTO tm1 VALUES('2009-06-04 22:00:00');
mysql> SET @@SESSION.time_zone = '+01:00';
mysql> SELECT * FROM tm1;
+---------------------+
| col |
+---------------------+
| 2009-06-04 23:00:00 |
+---------------------+

Источник

Найти по MAC адресу IP компьютера

Как-то случайно натыкался на полезные скрипты для определения по мак адресу айпи компьютера:

такой вот коротенький батничек, пингующий группу адресов и записывающий в файлик arp_table.txt

@echo off
if exist arp_table.txt (
if exist arp_table.bak del arp_table.bak
ren arp_table.txt arp_table.bak
)
for /L %%i in (1,1,254) do (
echo 192.168.0.%%i
ping -n 1 192.168.0.%%i>nul
arp -a 192.168.0.%%i>arp_string.tmp
for /F "skip=3 tokens=*" %%j in (arp_string.tmp) do (
echo %%j|find /V "invalid">>arp_table.txt
)
)
del arp_string.tmp

и более тотальный скрипт:

  1. '******************************************************************************
  2. '* File: mac2ip.vbs
  3. '* Purpose: Finds IP of the host with given MAC address.
  4. '* Syntax: cscript mac2ip.vbs /mac:MAC_ADDRESS /ip:IP_BLOCK [/p:pause]
  5. '* Version: 1.0.2
  6. '*
  7. '* Technology: VBSCRIPT,WSH,WMI
  8. '* Requirements: Windows XP or newer (uses Win32_PingStatus WMI class)
  9. '*
  10. '* Authors: 4u3u (asuhovey mtu-net ru)
  11. '*
  12. '******************************************************************************
  13. Option Explicit
  14. 'On Error Resume Next
  15. Dim objShell,strOutput,i,strMAC,objOutput,objAdapter,intPause
  16. Dim strSTime,strIP,strNameSpace,strQuery,colAdapters,PausePattern
  17. Dim colResult,IPPattern,MACPattern,strArpCommand,strOMAC
  18.  
  19. '* Matches valid MAC address
  20. MACPattern = "^([0-9a-f][0-9a-f]-){5}([0-9a-f][0-9a-f])$"
  21. '*Matches valid IP block
  22. IPPattern = "^b((25[0-5]|2[0-4]d|[01]dd|d?d).){3}$"
  23. '*Matches positive integer
  24. PausePattern = "^d+$"
  25.  
  26. '****************************************
  27. 'Parse arguments
  28. '****************************************
  29. strOMAC = WScript.Arguments.Named("mac")
  30. strMAC = Replace(LCase(strOMAC),":","-")
  31. strIP = Wscript.Arguments.Named("ip")
  32. intPause = Wscript.Arguments.Named("p")
  33. If intPause="" Then intPause=1000
  34. If Wscript.Arguments.Count<2 Then
  35. Syntax()
  36. End If
  37. If not ArgVrf(strMAC,MACPattern) Then
  38. WScript.Echo "ERROR: Invalid MAC: '" & strOMAC & "' Check syntax..." & VbCrLf
  39. Syntax()
  40. End If
  41. If not ArgVrf(strIP,IPPattern) Then
  42. WScript.Echo "ERROR: Invalid IP: '" & strIP & "' Check syntax..." & VbCrLf
  43. Syntax()
  44. End If
  45. If not ArgVrf(intPause,PausePattern) Then
  46. WScript.Echo "ERROR: Invalid Pause: '" & intPause & "' Must be positive integer." & VbCrLf
  47. Syntax()
  48. End If
  49.  
  50. ''****************************************
  51. 'Check if script is running by cscript.
  52. 'If not, restart script using cscript.
  53. '****************************************
  54. Set objShell = WScript.CreateObject("WScript.Shell")
  55. If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
  56. objShell.Run "cmd /k cscript.exe /nologo """ & WScript.ScriptFullName & """ /mac:" &_
  57. strOMAC & " /ip:" & strIP & " /p:" & intPause, 1, False
  58. WScript.Quit
  59. End If
  60.  
  61. '****************************************
  62. 'Check if given MAC is owned by local host
  63. '****************************************
  64. strNameSpace = "winmgmts:{impersonationLevel=impersonate}//./root/cimv2"
  65. strQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"
  66. Set colAdapters = GetObject(strNameSpace). ExecQuery(strQuery)
  67. For Each objAdapter in colAdapters
  68. If LCase(Replace(objAdapter.MACAddress,":","-")) = strMAC Then
  69. WScript.Echo strOMAC & " is YOUR MAC address!"
  70. WScript.Quit
  71. End If
  72. Next
  73.  
  74. '****************************************
  75. 'Ping all IPs in range.
  76. '****************************************
  77. strSTime = Now()
  78. strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & strIP
  79. For i = 1 To 254 Step 1
  80. Set colResult = GetObject(strNameSpace). ExecQuery(strQuery & i & "'")
  81. WScript.StdOut.Write "."
  82. If i/51-Int(i/51)=0 Then
  83. WScript.StdOut.WriteLine " " & Int(100*i/254) & "%"
  84. End If
  85. Next
  86. WScript.Echo ". 100%" & VbCrLf & "Ping completed in " & DateDiff("s",strSTime,Now()) & " seconds." & VbCrLf
  87.  
  88. '****************************************
  89. 'Get IP-MAC pair from ARP cache.
  90. '****************************************
  91. WScript.Sleep(intPause)
  92. strArpCommand = "%comspec% /c arp.exe -a | find /i """ & strMAC & """"
  93. Set objOutput=objShell.Exec(strArpCommand).StdOut
  94. WScript.Echo String(56,"=")
  95. i=0
  96. Do While Not objOutput.AtEndOfStream
  97. i=i+1
  98. strOutput = objOutput.ReadLine
  99. WScript.Echo StrOMAC & " is " & RTrim(Left(LTrim(strOutput),15))
  100. Loop
  101. If i=0 Then
  102. WScript.Echo strOMAC & " was NOT FOUND" &_
  103. " on the local network" & VbCrLf &_
  104. "Either host is unreachable or " & strIP &_
  105. "xxx is not" & VbCrLf & "your local network."
  106. End If
  107. WScript.Echo String(56,"=")
  108.  
  109. '****************************************
  110. 'Subroutines
  111. '****************************************
  112. '*Syntax
  113. Sub Syntax()
  114. Dim s
  115. s = "Finds IP of the host with given MAC address." & VbCrLf & VbCrLf
  116. s = s & "SYNTAX: cscript /nologo " & UCase(WScript.ScriptName) &_
  117. " /mac:MAC_ADDRESS /ip:IP_BLOCK [/p:pause]" & VbCrLf & VbCrLf
  118. s = s & " MAC_ADDRESS MAC address to search for. MAC_ADDRESS" & VbCrLf
  119. s = s & " is in XX-XX-XX-XX-XX-XX format. Both" & VbCrLf
  120. s = s & " ':' and '-' delimiters allowed." & VbCrLf
  121. s = s & " IP_BLOCK First three octets of local ip range to" & VbCrLf
  122. s = s & " scan. E.g. '192.168.0.' Only /24 subnets" & VbCrLf
  123. s = s & " are supported in current version." & VbCrLf
  124. s = s & " pause Pause after ping in milliseconds." & _
  125. VbCrLf & " Default is 1000 (1 second)" & VbCrLf & VbCrLf
  126. s = s & "Example:" & VbCrLf
  127. s = s & " cscript /nologo " & UCase(WScript.ScriptName) &_
  128. " /mac:01-23-45-67-89-AB /ip:192.168.0." & VbCrLf
  129. WScript.Echo s
  130. WScript.Quit 1
  131. End Sub
  132.  
  133. '*Arguments validation
  134. Function ArgVrf(arg,pattern)
  135. Dim objRegExp
  136. Set objRegExp = New RegExp
  137. objRegExp.IgnoreCase = true
  138. objRegExp.Pattern = pattern
  139. ArgVrf = objRegExp.Test(arg)
  140. Set objRegExp = Nothing
  141. End Function
  142.  
  143. '****************************************
  144. 'End of script
  145. '****************************************

Пошаговая настройка SSL для Apache

Перевод статьи «Step by Step: Configuring SSL Under Apache» автора Juliet Kemp.

Вступление

Если у вас безопасный веб-сервер, пользователи, волнующиеся за безопасность своих данных, могут быть уверены, что запросы зашифрованы, поэтому их данные в безопасности. Лучшим путем для этого является использование Apache 2, лидирующего веб-сервера под Linux и Secure Sockets Layer, протокол безопасной передачи данных. Transport Layer Security (TLS) является развитием SSL, но они работают практически одинаково. Я буду ссылаться только на SSL.

SSL — протокол для безопасной передачи зашифрованных данных между веб-браузером и веб-сервером. В большинстве случаев, аутентификацию проходит сервер, что позволяет клиенту быть уверенным в том, что сервер является требуемым ему, а не наоборот. Как бы то ни было, когда соединение устанавливается, обе стороны находятся в безопасности, так как только клиент и сервер имеют доступ к ключу. Это работает в течении многих запросов, сервер не интересует, кем является клиент так долго, сколько он остается тем же клиентом на протяжении запроса. Если вас волнует аутентификация клиента, есть возможность использовать клиентские SSL сертификаты (или htaccess, Kerberos или другие, близкие к ним методы), но это не будет рассматриваться в этой статье.

Будучи на стороне клиента, вас волнует, тому ли человеку (серверу) вы посылаете какие-либо личные данные, которые хотите зашифровать. Поэтому сервер, а не клиент, аутентифицируется. Вас также беспокоит участие третей стороны в доступе к вашим данным в том виде, каком вы их посылаете. SSL предоставляет оба этих вида безопасности.

Протокол SSL работает следующим образом:

1. Клиент подключается к веб-серверу и дает список доступных кодов.

2. Сервер берет наиболее устойчивый код, который поддерживает и он, и клиент, и посылает сертификат со своим именем и ключ кодирования, подписанный доверенным Удостоверяющим Центром (Certificate Authority, далее — CA), таким как Verisign.

3. Клиент проверяет сертификат с помощью CA. На практике, хранят набор CA локально, поэтому это может быть сделано без контакта в реальном времени с CA, и поэтому более быстро.

4. Клиент посылает назад случайное число, зашифрованное с помощью публичного ключа сервера. Только клиент знает это число, и только сервер может его расшифровать (используя личный ключ); вот где реализуется безопасность от участия третей стороны.

5. Сервер и клиент используют случайное число для генерирования содержимого ключа, который используется на протяжении передачи данных.

Мы хотим сделать это на стороне клиента настолько прозрачным, насколько это возможно, чтобы сделать передачу данных настолько легкой, насколько возможно.

Настройка Apache для работы с SSL проста, но есть несколько необходимых шагов. Эта статья рассказывает, как получить сертификат, подписанный CA и как скомпилировать и настроить Apache для работы с SSL. Я использую Apache 2 с mod_ssl. ApacheSSL (реализация Apache с возможностями SSL) также доступен, но сейчас он уже устарел; mod_ssl намного лучше.

Создание сертификата.

Первый шаг — создание сертификата. Вы можете создать сертификат с паролем или без него. Главным неудобством использования пароля является тот факт, что он должен быть введен каждый раз при старте сервера. Поэтому он не может запускаться без присмотра или автоматически при загрузке, например, после выключения электричества. В зависимости от ваших установок, это может быть значимым фактом для вас, или нет.

Теоретически, преимуществом использования пароля являтся повышение защиты. Хотя, на практике пароли не дает такой большой защиты. Если кто-то сможет прочитать или скопировать приватный ключ, значит, у него уже есть доступ к системе и возможность получить пароль, например, используя такую программу, как кейлоггер. Пароль защитит от скрипт-кидди, но не от серьезного взломщика. Возможно, для большинства людей нет смысла его использовать.

Для тестовых целей, или для небольшой локальной сети, вы можете создать сертификат, подписанный вами. Вы можете сделать это, выполнив команду:

openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 \
 
-nodes -keyout server.key -out server.crt \
 
-subj '/O=Company/OU=Department/CN=www.example.com'

Давайте рассмотрим опции более подробно:

— -x509 означает, что сертификат обязателен, правильнее, чем просто запрос сертификата (смотри ниже)

— -days 365 устанавливает время истечения сертификата, равное году. Вы можете увеличить этот срок. Запомните дату истечения срока, чтобы обновить её при необходимости.

— -sha1 указывает, что будет использован SHA1 для шифрования.

— rsa:1024 делает ключ 1024 битным RSA.

— -nodes указывает отсутствие пароля.

— -keyout и -out указывают, где хранить сертификат и ключ. Ключ должен быть доступен для чтения только для root; сертификат может быть доступен для чтения для world, но должен быть доступным для чтения пользователю, который запускает Apache.

— -subj устанавливает имя компании, имя отделения компании и адрес веб-сайта. Если вы это пропустите, вас попросят это сделать. CN должен совпадать с адресом сайта, иначе сертификат не будет соответствовать, и пользователи будут получать предупреждение при подключении. Убедитесь, что вы не запрашиваете пароль.

Проблема с использованием сертификата, подписанного самостоятельно для сервера, работающего в реальном времени, заключается в том, что любой браузер, работающий с сайтом, не будет признавать сертификат правильным. Это значит, что пользователя будут запрашивать о подтверждении сертификата. Очевидно, что в большинстве случаев это не является оптимальным решением. Хотя, это нормально для целей теста, а для небольших локальных сетей было бы плохим вариантом платить за сертификат от CA.

Не смотря на это, безусловно, лучше использовать сертификат, подписанный доверенным Удостоверяющим Центром, таким как Verisign (который имеет наибольший охват рынка), или меньшей организацией. Большинство браузеров уже имеют набор предустановленных сертификатов, заверенных CA, которые верифицируют сертификат вашего веб-сервера при подключении клиента. Это уменьшает количество трудностей для конечного пользователя и удостоверяет законность вашего сайта.

Чтобы получить сертификат, подписанный CA, прежде всего вы должны создать криптографическую пару и запрос сертификата:

openssl req -new -sha1 -newkey rsa:1024 -nodes \ 
 
-keyout server.key -out www.example.com.csr \ 
 
-subj '/O=Company/OU=Department/CN=www.example.com'

Этот пример работает так же, как и предыдущий, но на этот раз мы не используем опцию -x509. Выполнение этой команды приведет к генерации ключа и запроса сертификата, но не самого сертификата. Если вы ввели CN и так далее, вы не должны вводить адрес e-mail или пароль.

Ключ сервера (файл server.key, который, опять же, должен быть доступен для чтения только для root) остается на вашем веб-сервере; запрос (файл www.example.com.csr) отправляется в CA. Вы можете назвать файл запроса так, как вам вздумается, но назвав его по своему доменному имени, вы упростите задачу для CA.

Следующей стадией будет послать этот файл www.example.com.csr в CA, с вашей оплатой. Они должны вернуть его достаточно быстро, если вы предоставили всю требуемую информацию в вашем запросе. Выбранный вами CA объяснит их действия на своем сайте. Вам может понадобиться поменять формат файла на PEM, но, в случае Verisign, этого делать не придется.

Когда вы получите файл назад в PEM формате, переименуйте его в server.crt (это не является строгой необходимостью, но соответствует условиям Apache) и проверьте его:

    openssl verify -CAfile /path/to/trusted_ca.crt \
 
		-purpose sslserver server.crt

Затем проверьте, что результат выполнения этих двух команд одинаков, т.е., что сертификат соответствует приватному ключу:

    openssl x509 -noout -modulus -in server.pem | openssl sha1
 
    openssl rsa -noout -modulus -in server.key | openssl sha1

Теперь установите ваш ключ (сгенерированный выше как server.key) и сертификат (server.crt) в /etc/apache2/ssl или предпочитаемый вами каталог настроек, если он другой. Как указано выше, очень важно убедиться, что server.key доступен для чтения только для root, в то время как сертификат сервера может быть доступен для чтения для world, но принадлежать и быть доступным для записи только для root.

Компиляция Apache с SSL.

Итак, ваш сертификат сгенерирован. Теперь вам надо настроить свой сервер для его использования.

Для подавляющего большинства людей, лучшим способом установить и управлять Apache2 — модули, полученные через менеджер пакетов вашего дистрибутива. Apache2 из Debian идет вместе с модулем SSL, но он не включен по умолчанию. Для его включения вы должны выполнить команду: a2enmod ssl и перезапустить веб-сервер.

Чтобы сделать это, добавьте строчку

    Include /etc/apache2/mod_ssl.conf

в ваш /etc/apache2/apache2.conf (этот файл может также называться httpd.conf). Вы должны исправить её, обозначив соответствующее расположение файла mod_ssl.conf. Затем перезапустите веб-сервер.

Если вы хотите скомпилировать Apache2 из исходных кодов, в зависимости от того, какие установки вы до этого использовали, вы можете уже иметь или не иметь поддержку SSL. Проверьте это командой apache2 -l. Если перекомпиляция понадобится, запустите ./configure со всеми опциями, которые вы использовали до этого, добавив к ним —enable-ssl и —enable-setenvif (последняя нужна для совместимости с капризами Internet Explorer). Затем установите его как обычно, с помощью make;make install и проверьте правильность прав доступа.

Настройка Apache с SSL.

Следующим шагом будет настройка Apache2. Следующие инструкции приведут к запуску сервера как безопасного (порт 443) и как обычного веб-сервера (порт 80). Прежде всего, вам надо настроить сервер на принятие запросов на оба порта. Или отредактируйте /etc/apache2/ports.conf (в Debian, это входит в apache2.conf), или отредактируйте /etc/apache2/apache2.conf, включив строки:

Listen 80
 
Listen 443

Затем отредактируйте /etc/apache2/sites-enabled/yoursite для использования настроек SSL. Разделение настроек обычного и безопасного сервера с помощью VirtualHost — простейший способ из соображений условий эксплуатации. Любые настройки вне секций VirtualHost (например, установка ServerAdmin) будут применяться для обоих (и любых других) VirtualHost. Добавьте следующий текст в файл конфигурации:

# =================================================
 
# SSL/TLS settings
 
# =================================================
 
NameVirtualHost *:443
 
    DocumentRoot "/local/www/ssl_html"
 
    SSLEngine on
 
    SSLOptions +StrictRequire
 
        SSLRequireSSL
 
    SSLProtocol -all +TLSv1 +SSLv3
 
    SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
 
    SSLRandomSeed startup file:/dev/urandom 1024
 
    SSLRandomSeed connect file:/dev/urandom 1024
 
    SSLSessionCache shm:/usr/local/apache2/logs/ssl_cache_shm
 
    SSLSessionCacheTimeout 600    
 
    SSLCertificateFile /etc/apache2/ssl/server.crt
 
    SSLCertificateKeyFile /etc/apache2/ssl/server.key
 
    SSLVerifyClient none
 
    SSLProxyEngine off
 
        AddType application/x-x509-ca-cert      .crt
 
        AddType application/x-pkcs7-crl         .crl
 
    SetEnvIf User-Agent ".*MSIE.*" \  
 
      nokeepalive ssl-unclean-shutdown \  
 
      downgrade-1.0 force-response-1.0

Несколько замечаний об этой конфигурации:

— SSLEngine должен быть включен, обозначая, что сервер использует SSL.

— DocumentRoot устанавливает корневой каталог виртуального хоста. Это значит, что вы можете отделять безопасное содержимое от обычного.

— SSLRequireSSL запрашивает использование SSL (на этом виртуальном сервере), то есть, пользователь не может подключиться к этому виртуальному хосту с помощью обычного HTTP-запроса. Вот зачем мы разделили безопасное и обычное содержимое.

— SSLProtocol отключает все протоколы, отличные от TLS v1.0 и SSL v3.0. Для современных браузеров все будет работать хорошо.

— SSLCipherSuite устанавливает использование только HIGH и MEDIUM шифров. SHA1 считается более безопасным, чем MD5, поэтому выбран он.

— SSLCertificateFile и SSLCertificateKeyFile указывают расположение файлов сертификата и ключа.

— SSLVerifyClient должна быть установлена как ‘none’, если не используется аутентификация примера.

Чтобы запускать обычный сервер на 80 порту, добавьте следующий текст в конфигурационный файл:

NameVirtualHost: *.80
 
    DocumentRoot "/local/www/html"

После сохранения отредактированного конфигурационного файла, перезапустите сервер. Если вы использовали пароль при генерации сертификата, вам понадобится ввести его при запросе.

Тестирование.

Создайте базовую страницу index.html в корневой директории вашего сервера, если у вас ещё нет содержимого там.

Затем направьте свой браузер на https://yoursite.com. Вы должны увидеть открытие SSL-соединения и загрузку страницы. Если вы используете сертификат, подписанный вами, ваш браузер даст предупреждение о том, что подлинность сервера не может быть проверена. Вы можете выбрать просмотр сертификата и принять его. Если вы используете внешний сертификат, все должно пройти без проблем.

Убедитесь, что не можете получить доступ к безопасному содержимому, используя http://. Если вы попробуете, вы должны получить сообщение об ошибке.

Устранение проблем.

Если это работает не так, как ожидалось, прежде всего, проверьте, что ваш сервер вообще запущен с помощью команды ps -a | grep apache. Если она не вернет результата, попробуйте перезапустить сервер и проверьте сообщения об ошибке в консоли.

Также проверьте, что права доступа к файлам сертификата и ключа установлены правильно (см. выше), также, как и права к тестовому HTML-файлу и директории, в которой он находится.

Затем, проверьте логи. Вы должны проверить как логи сервера, так и логи SSL, которые вы настроили в конфигурационном файле выше. Если вы не нашли там ничего полезного, попробуйте поменять значение LogLevel в файле конфигурации Apache2 на ‘debug’, перезапустите Apache2 и протестируйте снова. Это должно дать больше данных в логах.

Если вы запускаете веб-сервер на 80 порту, попробуйте запросить страницу с помощью http://, вместо https://, чтобы понять, заключается ли проблема в веб-сервере или в SSL-соединении. Учтите, что в приведенных выше установках, корневые каталоги веб-сервера разные для http:// и https://, так что вы не можете (или не должны!) получить доступ к тому же содержимому. Если ваша тестовая страница в корневом каталоге http:// работает, в то время, как тестовая страница в корневом каталоге https:// не работает, это поможет вам более точно указать на проблему.

Если проблема в SSL соединении, удобным инструментом будет s_client, который является диагностической утилитой для решения проблем в TLS/SSL-соединениях. Обычное его использование: /usr/bin/openssl s_client -connect localhost:443. Также существует множество других опций, которые вы можете узнать из документации. Если вы получили сообщения об ошибках, это должно вам помочь в определении проблемы.

Заключение.

Поздравляю! Теперь у вас есть рабочий безопасный сервер, с сертификатом, автоматически проверяемым большинством современных браузеров.