0001-Authorize-based-on-certificate-chain.patch

Ted Hesselroth, 07/21/2011 09:48 PM

Download (4.05 KB)

View differences:

src/cloud/ec2/lib/EC2QueryServer.rb
93 93
        # For https, the web service should be set to include the user cert in the environment.
94 94
	cert_line_in = env['HTTP_SSL_CLIENT_CERT']
95 95
	        	
96
        if cert_line_in ==""
96
        if cert_line_in == nil
97 97
	# Use the secret key for authentication.
98 98
		
99 99
            password = get_user_password(params['AWSAccessKeyId'])
......
127 127
        else
128 128
	#  Use the https credentials for authentication	
129 129
	
130
	    # Get the DN from the certificate
131
            begin
132
                cert_array=cert_line_in.scan(/([^\s]*)\s/)
133
                cert_array = cert_array[2..-3]
134
                cert_array.unshift('-----BEGIN CERTIFICATE-----').push('-----END CERTIFICATE-----')
135
                user_cert = cert_array.join("\n")
136
                user_cert = OpenSSL::X509::Certificate.new(user_cert)
137
                subjectname = user_cert.subject.to_s
138
                subjectname_nosp = subjectname.gsub(/\s/, '')
139
                puts(subjectname)
140
            rescue
141
	        raise failed + "Could not create X509 certificate from " + user_cert
130
            while cert_line_in != nil
131
                # Get the DN from the certificate
132
                begin
133
                    cert_array=cert_line_in.scan(/([^\s]*)\s/)
134
                    cert_array = cert_array[2..-3]
135
                    cert_array.unshift('-----BEGIN CERTIFICATE-----')
136
		    cert_array.push('-----END CERTIFICATE-----')
137
                    user_cert = cert_array.join("\n")
138
                    user_cert = OpenSSL::X509::Certificate.new(user_cert)
139
                    subj_name = user_cert.subject.to_s
140
                rescue
141
	            raise failed + "Could not create X509 certificate from " + cert_line_in
142
	        end
143
	
144
	        # Password should be DN with whitespace removed.
145
	        subjectname = subj_name.gsub(/\s/, '')
146
		chain_dn = "" if chain_dn == nil
147
		chain_dn = chain_dn + "\n" + subjectname
148
	        begin
149
	            username = get_username(subjectname)
150
	            STDERR.puts("Username " + username + " found for DN " + subjectname)
151
		    STDERR.flush
152
	            break
153
	        rescue
154
	            STDERR.puts "No username found for DN " + subjectname
155
		    STDERR.flush
156
		    chain_index = 0 if chain_index == nil
157
		    chain_index = chain_index + 1
158
		    cert_chain_key = "HTTP_SSL_CLIENT_CERT_CHAIN#{chain_index}"
159
		    cert_line_in = env[cert_chain_key]
160
	        end
142 161
	    end
143 162
	
144
	    # Check that the DN corresponds to the password of a user
145
	    begin
146
	        username = get_username(subjectname_nosp)
147
	        puts("The username is " + username)
148
	    rescue
149
	        raise failed + "User with DN " + subjectname + " not found."
163
	    if cert_line_in == nil
164
	        raise failed + "Username not found in certificate chain " + chain_dn
150 165
	    end
151 166
	
152 167
	    # Sign the message and compose the special login token
......
173 188
 	        host_key_array=host_cert_array[begin_index..end_index]
174 189
	        private_key=host_key_array.join("\n")
175 190
 	    rescue
176
 	        raise failed + "Could not get private key from " + '/etc/grid-security/hostkey.pem'
191
 	        raise failed + "Could not get private key from " + @hostkey
177 192
 	    end
178 193

  
179 194
	    begin
180 195
	        rsa=OpenSSL::PKey::RSA.new(private_key)
181 196
	    rescue
182
	        raise failed + "Could not create RSA key from " + '/etc/grid-security/hostkey.pem'
197
	        raise failed + "Could not create RSA key from " + @hostkey
183 198
	    end
184 199
	
185 200
	    # Sign with timestamp
186
-