|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Предполагается что валидный непросроченный сертификат, соответствующий адресу отправителя в системе имеется. (если не имеется, значит не подписываем) Для CDO я нашел готовый пример (на VB6, но какая разница): How to send digitally signed messages by using CDOSYS/CDOEX Потенциальный минус кода, бросающийся в глаза: используется CAPICOM которая в отличии от SDOSYS штатным компонентом системы не является (надо доустанавливать с MS). На рабочем компе CAPICOM у меня установлен (его требует signtool.exe которым я подписываю файлы проги) , но код пока не проверял. Наверняка можно через API. И подозреваю что саму подпись можно добавить и .Net средствами, я cмотрю в .Net много всего на эту тему, чуть ли не больше чем в WIN API, хотя странно это. С System.Net.Mail так понимаю сложнее, т.е. как-то надо выдернуть контекст подготовленного Net.Mail.MailMessage, подписать его и сделать новое Net.Mail.MailMessage. Ну, я не нашел нормальных примеров, и есть сомнения что это в общем случае возможно (с вложениями и т.п.). Сторонние либы - ну их нафиг, не рассматриваем, уже с IMAP пытался "освоить", время зря потратил. Есть соображения? P.S. На всяк. случай уточню: речь идет о подписи сообщения, а не о его шифровании - это разные вещи. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2015, 18:39 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
А как мне из хранилища выбрать валидный для подписи e-mail сертификат? Да хоть с CAPICOM, хоть с .Net Я пока VB6 пример решил разобрать, но там ф-ции не хватает, типа пишите сами: Код: vbnet 1.
17687782 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2015, 21:10 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77, Методом тыка и не только, открываем хранилище My и выбираем сертификаты все, и выводим их назначения. Я так думаю, тебе нужно будет выбрать с тем OID, который соответствует подписи Email. Проверять можно методом Verify(), вроде работает. На MSDN примерчики есть, если искать по классу X509*** Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2015, 21:38 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
VSVLAD, Рекомендуешь сразу через .Net пробовать, если разбирать приведенный мной пример с CDO? Та часть что относится к CAPICOM, она мне как раз не нравится, почему написал. Полагаю ее можно заменить на .Net -классы (твой код). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2015, 21:50 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77, Где-то читал, что начиная с Висты CAPICOM официально больше не поддерживается, и рекомендуют заменять .NET классами X509Certificates ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2015, 06:50 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
VSVLAD, Найти сертификат, по большому счету фигня. Ну у меня пока и с CAPICOM ни с VB6, ни с .Net нифига с MS-примером не получилось. Оригинальный код из статьи не работает, возможно из-за этой строчки: Код: vbnet 1. 2.
(oSecMsg походу битый получается, вообще не отправляет) Если передавать оригинальный byRef oMsg на подпись, то в зависимости от варианта: Код: vbnet 1.
приходит либо битая фигня (если с StrConv), либо подписанная но опять же фигня (если без StrConv), Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98.
С .Net вот нарыл "аналог", подпись вроде ставит (в варианте с false ) , и она есть в пришедшем письме, но только в заголовках, а не в виде значочка, то бишь не то подписываю что отправляю, какие-то байты напутаны. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271.
Причем проблема так понимаю исходит из того же преобразования, которая в VB6 сидит в строчке StrConv(strContent, vbFromUnicode). Да забью наверно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2015, 07:57 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Повозился, вроде как интересно стало. Вот максимум чего удалось добиться (CAPICOM в .Net не нужна) -это полный аналог VB6 кода от MS что я привел в первом посте: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121.
Проблемы такие: 1) Данный код реализует "Кодировать сообщения перед подписыванием (непрозрачная подпись)", то бишь без OE-подобного в каком-нибудь Web-клиенте который сертификатов в лоб не видит фиг прочтешь. Т.е. код прошивает main bodypart подписью насквозь (не шифрование, но на дурака уже не прочтешь) Правильно конечно подписать main bodypart вот так: Код: vbnet 1. 2.
и получившееся добавить в новую BodyPart oSecMsg.BodyPart.AddBodyPart Но сколько я не мудохался, ничего не выходит. Подпись в конец "прозрачно добавляется" но она ошибочная(не соответствует content). Вот код (аналогичен первому, но есть отличия в алгоритме), м.б. кто сообразит в чем засада: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76.
Проблема 2) С сертификатом для user@gmail у меня вот эта строчка Код: vbnet 1.
съедает сертификат автоматически А с другим мылом выдает ошибку: типа автоматически невозможно. В обоих случаях сертификат однозначным образом определяется. Помогает конечно вывод системного диалога подтверждения подписи: Код: vbnet 1.
Но меня так не устраивает. Как прога автоматически будет отправлять подписанные письма? Нет какого коллбэка для автоподтверждения? Хотя подозреваю что это может быть связано с настройкой самого сертификата и тогда ничего сделать нельзя. Вопрос 3. Ну а для System.Net.Mail подписать никак? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 01:05 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77 Проблема 2) С сертификатом для user@gmail у меня вот эта строчка Код: vbnet 1.
съедает сертификат автоматически А с другим мылом выдает ошибку: типа автоматически невозможно. В обоих случаях сертификат однозначным образом определяется. Помогает конечно вывод системного диалога подтверждения подписи: Код: vbnet 1.
Но меня так не устраивает. Как прога автоматически будет отправлять подписанные письма? Нет какого коллбэка для автоподтверждения? Хотя подозреваю что это может быть связано с настройкой самого сертификата и тогда ничего сделать нельзя. Это можно и нужно решать двумя способами. 1) При импорте сертификата в хранилище CurrentUser(Текущий пользователь) не ставить галку напротив "включать усиленную защиту закрытого ключа". Если поставить (как я обычно делаю), то будет выдавать предупреждение при каждом подписывании, что несовместимо с "автоматикой" и функцией signedCms.ComputeSignature(signer, True ). Но иногда однако прокатывает и с "усиленной защитой" (с сертификатом от Comodo на Win8.1 в моем случае, причем на XP с тем же сертификатом при "усиленной защите" уже не работает). 2) (наиболее правильный). Импортировать сертификат в хранилище LocalSystem (Локальный компьютер). При этом никаких "усиленных защит" при импорте сертификата вообще не предлагается и все всегда работает (для любого пользователя). И, это единственный правильный путь если прога имеет место быть работает сервисом NT. Дмитрий77 Вопрос 3. Ну а для System.Net.Mail подписать никак? Пожалуй лучшая статья что я нашел на эту тему. Sending S/MIME encrypted email using C# (там приведен конкретный алгоритм) Но в целом понятно что на "Net.-халяву" для общего случая (с вложениями и т.п.) сделать не получится, т.к. .Net-овский конструктор MailMessage крайне скуден даже если сравнивать с CDO.Message. Так понимаю если только весь MIME для body ручками писать, при доступности CDO оно того не стоит. Дмитрий77 1) Данный код реализует "Кодировать сообщения перед подписыванием (непрозрачная подпись)", то бишь без OE-подобного в каком-нибудь Web-клиенте который сертификатов в лоб не видит фиг прочтешь. Т.е. код прошивает main bodypart подписью насквозь (не шифрование, но на дурака уже не прочтешь) Правильно конечно подписать main bodypart вот так: Код: vbnet 1. 2.
и получившееся добавить в новую BodyPart oSecMsg.BodyPart.AddBodyPart Но сколько я не мудохался, ничего не выходит. Подпись в конец "прозрачно добавляется" но она ошибочная(не соответствует content). А вот это самое обидное -что не удалось с прозрачной подписью (с CDO, второй длинный код что я привел целиком выше, подпись битая получается). В лучшем случае где-то напутал с какими-то байтами. Но есть еще подозрение что в принципе не заведется. В том случае если при добавлении к Body новой BodyPart (подпись Body), CDO автоматом меняет какие-то байты и/ли заголовки в исходных BodyParts (которые подписываем). Если это так, то задача в CDO-модели в принципе не решаема, но не уверен что так. Обидно-с. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 20:04 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
VSVLADДмитрий77, Где-то читал, что начиная с Висты CAPICOM официально больше не поддерживается, и рекомендуют заменять .NET классами X509CertificatesА чего бы ему не поддерживаться? Это обычная COM-dll. Зарегистрировал и вперед. Другое дело, она может юзать апи, которых больше нет. Но тогда резко становится несовместимым весь софт, которых их юзает напрямую. Да не, скорее всего смысл в том, что capicom по каким-то причинам больше не входит в дистрибутив. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 20:29 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Antonariy, CAPICOM в .Net полностью заменяется на вот это, нарочно вынес в 2 отдельные ф-ции, это финальный вариант (уже вставил первый код что выше в проект): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Скажи лучше, м.б. ты знаешь почему у меня нижний код не делает желаемого эффекта и в чем грабли (с пристыковкой прозрачной подписи). Почему работает верхний - понятно, потому что я целиком заменяю Body на "подписанный кусок" (непрозрачная подпись). Т.е. если я чуть (на пару байтов) искажаю оригинал, то подписываю я уже "искаженный" и это не страшно. А во втором случае один байт уже критичен. Коды все рабочие и я ничего не выкидывал. Можешь вставить проект и попробовать. Бесплатный сертификат для почты можно взять на Comodo. P.S. Мне просто обидно что не завелось. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 21:02 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77Скажи лучше, м.б. ты знаешь почему у меня нижний код не делает желаемого эффекта и в чем грабли (с пристыковкой прозрачной подписи).Вообще без понятия, я capicom мимоходом смотрел и с сертификатами не работал. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 21:14 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Antonariy, пофиг, с CDO то наверно работал. надо понять правильно ли я читаю Content мыла в байт массив data через GetStream (adodb.stream) Код: vbnet 1. 2.
Честно говоря меня 1252 несколько смущает, но с 1251, ASSI, Unicode или Default русский текст закодированный в MIME с флагом utf-8 корячится. Утверждение бардачное, но тем не менее. Объяснение про 1252 вычитал на каком то форуме (.UK), вообще хз, тамошний ТС кроме English возможно других языков не знает, и если его утверждение не обобщенное, то возможно в этом 1252 собака и зарыта. Я подписываю именно байт-массив data As Byte() а результат (подпись) добавляю как новый раздел oBodyPart = oSecMsg.BodyPart.AddBodyPart в мой CDO.Message. Если я в data As Byte() получил "чуть не то", то у меня подпись уже не верна, что и имеет место быть. А как я из data() получаю саму подпись signedbytes As Byte() (через CAPICOM или через .Net -хрени) -это уже пофиг - они абсолютно одно и то же одинаково хорошо делают. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2015, 23:37 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77Antonariy, пофиг, с CDO то наверно работал.Работал, но сильно не вникал. Сделал - заработало - забыл. Мне от него были нужны лишь самые базовые функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2015, 01:44 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Кажется понял ошибку: У меня структура неподписанного письма грубо такая Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Проверил как почтовик подписывает, вот как должно выглядеть грубо подписанное письмо: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
А то что я делаю своим кодом (где пытаюсь поставить прозрачную подпись) это бред и понятно что письмо битое, почтовик ругается и если что-то и отображает то в искаженном виде, например запихивает текст письма во вложение, отображает подпись как вложение, а если и показывает подпись, то пишет что подпись недействительна (как контекст ляжет) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Т.е. правильно думаю создать новое письмо. Объявить Content-Type: multipart/signed и добавить 2 части 1) то что является первым письмом 2) то что является подписью первой части С пониманием этого надо попробовать еще раз, думаю CDO справится. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2015, 12:38 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Ну сделал логически правильный код для прозрачной подписи, но с multipart/mixed (вариант 1) подпись битая. Если из исходного письма выдрать только одну часть (любую) (вариант 2 раскомментировать, вариант 1 закомментировать), то делает прозрачную подпись корректно. На входе предполагается письмо с multipart/mixed (например text/plain + вложение). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96.
Ощущение такое, что как только добавить вторую часть с подписью первой, то CDO автоматом переписывает и первую (подписанную часть, одного байта достаточно) если она сама содержит вложенные части (сама является multipart), причем побороть похоже никак. Если первая (подписываемая) часть не имеет вложенности, то тогда трюк проходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 00:39 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Идиотизм конечно, CDO в последний момент выкидывает из уже подписанной multipart/mixed части строчку: Код: vbnet 1.
Если сделать вот так: Код: vbnet 1. 2. 3. 4. 5. 6.
то код становится рабочим и подпись верна. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99.
Но м.б. есть способ выкинуть эту фразу еще до подписывания. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 01:42 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77Но м.б. есть способ выкинуть эту фразу еще до подписывания. Не никак. Она даже после .Send там остается (если выковыривать через oSecMsg.BodyPart.BodyParts(1).GetStream.ReadText) , а приходит без нее. и если сделать oSecMsg.GetStream.SaveToFile("full.eml"), то там ее тоже нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 02:07 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Мляха, когда уже VB.NET уберут из Студии ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 03:19 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
AxeleronМляха, когда уже VB.NET уберут из Студии Если б ты по делу мыслишек подкинул с приложением кода из своего шарпа, это было бы интереснее. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 03:23 |
|
А как используя Net.Mail и CDO.Message подписать отправляемое мыло цифровой подписью?
|
|||
---|---|---|---|
#18+
Дмитрий77Если б ты по делу мыслишек подкинул с приложением кода из своего шарпа, это было бы интереснее. Пятница, вечер (поздний), все мыслишки остались размазаны по рабочему столу... Прости ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2015, 03:26 |
|
|
start [/forum/topic.php?fid=20&fpage=84&tid=1401494]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 316ms |
total: | 453ms |
0 / 0 |