I tried your patch against https://svn.eu.apache.org/repos/asf/subversion/README
(which uses a non-self-signed cert, but rather one for which the cert's
hostname differs from the URI's hostname), and it didn't seem to work:

[[[
 ./tools/examples/get-location-segments.py 
https://svn.eu.apache.org/repos/asf/subversion/README
Untrusted cert details are as follows:
--------------------------------------
Issuer     : 07969287, http://certificates.godaddy.com/repository, GoDaddy.com, 
Inc., Scottsdale, Arizona, US
Hostname   : svn.apache.org
ValidFrom  : Thu, 13 Nov 2008 18:56:12 GMT
ValidUpto  : Thu, 26 Jan 2012 14:18:55 GMT
Fingerprint: cc:54:a4:a9:ec:3a:9b:1c:23:ac:2d:57:c6:96:9f:5f:4a:1d:2d:86

accept (t)temporarily   (p)permanently: t
Traceback (most recent call last):
  File "./tools/examples/get-location-segments.py", line 147, in <module>
    main()
  File "./tools/examples/get-location-segments.py", line 142, in main
    ra_session = ra.open(url, ra_callbacks, None, ctx.config)
  File "/usr/lib/pymodules/python2.6/libsvn/ra.py", line 534, in svn_ra_open
    return _ra.svn_ra_open(*args)
svn.core.SubversionException: ("OPTIONS of 
'https://svn.eu.apache.org/repos/asf/subversion/README': Server certificate 
verification failed: certificate issued for a different hostname 
(https://svn.eu.apache.org)", 175002)
zsh: exit 1     ./tools/examples/get-location-segments.py 
]]]

What am I missing?


Prabhu Gnana Sundar wrote on Thu, Aug 18, 2011 at 17:15:09 +0530:
> Hi all,
> 
> Till now the get-location-segments.py script does not work against
> self-signed ssl servers. Now I have worked on
> the script and made it work even against the untrusted self-signed
> ssl servers.
> 
> Attaching the patch and the log message with this mail. Please share
> your thoughts.
> 
> 
> 
> Thanks and regards
> Prabhu

> get-location-segments.py script would now work for self-signed ssl servers too
> 
> * tools/examples/get-location-segments.py
>   (main): added a couple of auth providers to enable authenticating
>           against self-signed ssl servers too (in interactive mode).
>   (prompt_func_ssl_unknown_cert): new callback function
>   (prompt_func_simple_prompt): new callback function
> 
> Patch by: Prabhu Gnana Sundar <prabhugs{_AT_}collab.net>

> Index: tools/examples/get-location-segments.py
> ===================================================================
> --- tools/examples/get-location-segments.py   (revision 1153033)
> +++ tools/examples/get-location-segments.py   (working copy)
> @@ -21,6 +21,7 @@
>  #
>  import sys
>  import os
> +import getpass
>  from svn import client, ra, core
>  
>  def printer(segment, pool):
> @@ -71,6 +72,39 @@
>    return url, peg_revision, start_revision, end_revision
>  
>  
> +def prompt_func_ssl_unknown_cert(realm, failures, cert_info, may_save, pool):
> +  print "Untrusted cert details are as follows:"
> +  print "--------------------------------------"
> +  print "Issuer     : " + str(cert_info.issuer_dname)
> +  print "Hostname   : " + str(cert_info.hostname)
> +  print "ValidFrom  : " + str(cert_info.valid_from)
> +  print "ValidUpto  : " + str(cert_info.valid_until)
> +  print "Fingerprint: " + str(cert_info.fingerprint)
> +  print ""
> +  ssl_trust = core.svn_auth_cred_ssl_server_trust_t()
> +  if may_save:
> +    choice = raw_input( "accept (t)temporarily   (p)permanently: ")
> +  else:
> +    choice = raw_input( "(r)Reject or accept (t)temporarily: ")
> +  if choice == "t" or choice == "T":
> +    ssl_trust.may_save = False
> +    ssl_trust.accepted_failures = failures
> +  if choice == "p" or choice == "P":
> +    ssl_trust.may_save = True
> +    ssl_trust.accepted_failures = failures
> +  else:
> +    ssl_trust = None
> +  return ssl_trust
> +
> +def prompt_func_simple_prompt(realm, username, may_save, pool):
> +  username = raw_input("username: ")
> +  password = getpass.getpass(prompt="password: ")
> +  simple_cred = core.svn_auth_cred_simple_t()
> +  simple_cred.username = username
> +  simple_cred.password = password
> +  simple_cred.may_save = False
> +  return simple_cred
> +
>  def main():
>    try:
>      url, peg_revision, start_revision, end_revision = 
> parse_args(sys.argv[1:])
> @@ -94,6 +128,8 @@
>    providers = [
>      client.get_simple_provider(),
>      client.get_username_provider(),
> +    core.svn_auth_get_simple_prompt_provider(prompt_func_simple_prompt, 2),
> +    
> core.svn_auth_get_ssl_server_trust_prompt_provider(prompt_func_ssl_unknown_cert),
>      client.get_ssl_server_trust_file_provider(),
>      client.get_ssl_client_cert_file_provider(),
>      client.get_ssl_client_cert_pw_file_provider(),

Reply via email to