我是初学者。使用SSL时遇到问题。 我在互联网上找到了一个代码c。在服务器代码中,有一个跟随功能:
<script id="moduleNameDialog.html" type="text/ng-template"> <div class="default-dialog modal-dialog-module-naming"> <div class="modal-header"> <h3 class="modal-title">Vorlage speichern</h3> <a class="close-icon" href="" data-ng-click="dialog.cancel()" tabindex="-1">X</a> </div> <form name="dialog.moduleNamingForm" role="form" class="dtag-validation" novalidate="novalidate" data-ng-submit="dialog.moduleNamingForm.$valid && dialog.module.checkModuleName(dialog.close)"> <div class="modal-body"> <p> Benennen Sie Ihre Version des Moduls – so können Sie diese als Vorlage später wiederverwenden. </p> <div class="text-small">Der Name muss 4-40 Zeichen lang sein. Erlaubte Zeichen: -!§$%&/()=?+*~,#</div> <div class="floating-lbl-field-group center-block margin-top-10"> <label for="moduleName">Name</label> <input type="text" autocomplete="off" class="form-control" name="moduleName" placeholder="Name" required="required" pattern="[a-zA-ZäöüÜÄÖß0-9-\s!§$%\x26/()=?+*~,#]{4,40}" data-ng-model="dialog.module.newModule.moduleInstanceName" data-validation-tooltip="Bitte geben Sie einen gültigen Namen ein" data-validation="" autofocus="autofocus" /> </div> </div> <div class="modal-footer"> <a role="button" class="btn btn-default btn-medium btn-half-width" href="" data-ng-click="dialog.module.back(dialog.close)"> Zurück </a> <button type="submit" class="btn btn-primary btn-medium btn-half-width" data-validation-submit=""> Fertig </button> </div> </form> </div> </script>
当我使用命令时:openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem并运行./sslserver.o 443然后我运行./client localhost 443。服务器错误:&#34;没有证书。&#34;。我认为原因SSL_get_peer_certificate(ssl)返回null但我不知道修复它的方法。你能帮我吗? 完整代码:http://simplestcodings.blogspot.com/2010/08/secure-server-client-using-openssl-in-c.html
答案 0 :(得分:1)
如果客户端已发送证书,则SSL_get_peer_certificates仅返回服务器端的证书。但是您引用的代码不会请求客户端证书,这意味着客户端不会发送一个。要申请客户端证书,服务器需要使用SSL_CTX_set_verify并将模式设置为至少SSL_VERIFY_PEER
,即至少需要执行此操作:
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
但这只会请求一个可选的客户端证书。它不会导致验证。请注意,您使用的代码示例无论如何都会被破坏,因为它不进行任何类型的证书验证。这意味着它在中间攻击中对琐碎的人开放,即在使用SSL时不提供您期望的安全性。因此,我建议不要将此代码用作如何编写安全SSL客户端和服务器的示例。